我真的需要这个存储过程中的参数吗?

时间:2011-11-10 00:36:55

标签: oracle plsql oracle9i

以下存储过程旨在从Oracle数据库中获取所有BLOB值,并将它们保存到名为OraFolder的文件夹中。

编译得很好,但我有两个问题。

1,有2个参数,pname和display_name。我必须承认我不知道他们在那里是因为我只是搜索了似乎符合我们需要的代码。

我的问题是,我真的需要2个参数,因为我们正在尝试将所有BLOB值提取到文件夹中吗?

2,如果您的回答是肯定的,我确实需要它们,我该如何使用它们?

最后,有一个Entry_Id,我只是一直收到一个未声明的错误。我不得不删除它。它用于什么?

Sorr,我不是一个甲骨文家伙,只是想找出一个解决问题的问题。

提前致谢

这是完整的存储过程。

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;

2 个答案:

答案 0 :(得分:0)

看起来vname是写入blob的文件的名称。 pname是表格中blob的关键。因此,如果你要将所有blob转储到表中,那么你不需要其中任何一个,但是你需要为每个blob提供一个唯一的文件名。

答案 1 :(得分:0)

pfname param定义要抓取的文件,因此您不需要它,因为您需要它们。

display_name param定义了输出目录,所以如果你想对目录进行硬编码,你可以。

由于您需要所有文件,因此您需要遍历表中的所有记录并一次输出一个:

CREATE OR REPLACE PROCEDURE blob2file 
IS
   l_output    utl_file.file_type;
   vstart      NUMBER := 1;
   bytelen     NUMBER := 32000;
   x           NUMBER;
   my_vr       RAW(32000);
BEGIN

   FOR recFiles IN (SELECT dbms_lob.getlength(BLOB_CONTENT) as len,
                           FILENAME,
                           BLOB_CONTENT
                      FROM PORTAL.WWDOC_DOCUMENT$)
   LOOP

      l_output := utl_file.fopen('MY_FOLDER', '/hard code the path here/', 'w', 32760);

      IF recFiles.len < 32760 THEN

         utl_file.put_raw(l_output, recFiles.BLOB_CONTENT);
         utl_file.fflush(l_output);

      ELSE -- write in pieces

         vstart := 1;

         WHILE vstart < refFiles.len
         LOOP
            dbms_lob.read(recFiles.BLOB_CONTENT, 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;

      utl_file.fclose(l_output);
      dbms_output.put_line('End');

EXCEPTION
   WHEN OTHERS THEN 
      dbms_output.put_line('ERROR: ' || SQLERRM);

END blob2file;