以下存储过程旨在从Oracle数据库中获取所有BLOB值并将其保存到名为OraFolder的文件夹中。我真的需要这个存储过程中的参数吗?
它编译得很好,但我有2个问题。
1,有2个参数,pname和display_name。我必须承认,我不知道他们在那里是什么,因为我只是搜索了似乎符合我们需要的代码。
我的问题是我真的需要2个参数,因为我们试图将所有BLOB值提取到一个文件夹中?
2,如果您的答案是肯定的,我确实需要他们,我该如何使用他们?
最后,有一个Entry_Id,我只是不断收到一个错误,它没有声明。我不得不删除它。它是干什么用的?
Sorr,我不是甲骨文的人,只是试图找出一个WA来解决掉在我圈上的问题。
在此先感谢
这里是完整的存储过程。
create or replace PROCEDURE blob2file(pfname VARCHAR2, display_name in varchar2) IS
vblob BLOB;
vstart NUMBER := 1;
bytelen NUMBER := 32000;
len NUMBER;
my_vr RAW(32000);
x NUMBER;
v_name varchar2(100);
lv_str_len NUMBER;
l_output utl_file.file_type;
BEGIN
-- define output directory
lv_str_len := length(pfname);
--v_name := display_name||upper(substr(pfname,lv_str_len-3,lv_str_len));
v_name := display_name;
l_output := utl_file.fopen('MY_FOLDER', v_name, 'w', 32760);
-- get length of blob
SELECT dbms_lob.getlength(blob_content)
INTO len
FROM portal.WWDOC_DOCUMENT$
WHERE FILENAME = pfname;
-- dbms_output.put_line('Length: '||len);
-- save blob length
x := len;
-- select blob into variable
SELECT blob_content
INTO vblob
FROM portal.WWDOC_DOCUMENT$
WHERE FILENAME = pfname;
-- if small enough for a single write
IF len < 32760 THEN
-- dbms_output.put_line('Single write ');
utl_file.put_raw(l_output,vblob);
utl_file.fflush(l_output);
ELSE -- write in pieces
-- dbms_output.put_line('multi write '||vstart);
vstart := 1;
WHILE vstart < len
LOOP
dbms_lob.read(vblob,bytelen,vstart,my_vr);
utl_file.put_raw(l_output,my_vr);
utl_file.fflush(l_output);
-- set the start position for the next cut
vstart := vstart + bytelen;
-- set the end position if less than 32000 bytes
x := x - bytelen;
IF x < 32000 THEN
bytelen := x;
END IF;
END LOOP;
END IF;
dbms_output.put_line('End');
utl_file.fclose(l_output);
EXCEPTION
when others then dbms_output.put_line('ERROR:'||entry_id);
END blob2file;
我假定这是黑客攻击了一个你得编译。 PL是一种图灵完备的语言,它与基于ADA的其他语言具有相同的规则。请给我看原始的SP,我会看看我能做些什么。 – FlyingGuy
好的,谢谢。我用您请求的原件替换了发布的代码。 – Kenny