Мне действительно нужны параметры в этой хранимой процедуре? - PullRequest
0 голосов
/ 10 ноября 2011

Следующая хранимая процедура предназначена для сбора всех значений BLOB из базы данных Oracle и их сохранения в папке с именем OraFolder.

Он компилируется нормально, но у меня есть 2 вопроса.

1, есть 2 параметра, pname и display_name. Я должен признать, что я не знаю, для чего они там, потому что я просто погуглил код, который, кажется, соответствует нашим потребностям.

Мой вопрос: действительно ли мне нужны 2 параметра, учитывая, что мы пытаемся извлечь ВСЕ значения BLOB в папку?

2, если ваш ответ да, они мне нужны, как мне их использовать?

Наконец, есть Entry_Id, я просто продолжаю получать сообщение об ошибке, что оно не объявлено. Я должен был удалить это. Для чего он используется?

Извините, я не парень из Oracle, просто пытаюсь выяснить, как решить проблему, которая выпала у меня из колен.

Заранее спасибо

Вот полный сохраненный процесс.

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 голосов
/ 10 ноября 2011

Параметр pfname определяет, какой файл захватить, поэтому вам это не нужно, поскольку вы хотите их все.

Параметр display_name определяет выходной каталог, поэтому, если вы хотите ввести жесткий кодкаталог, вы могли бы.

Поскольку вы хотите, чтобы все файлы, вам нужно будет перебрать все записи в таблице и выводить их по одной:

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;
0 голосов
/ 10 ноября 2011

Похоже, vname - это имя файла, в который записан большой двоичный объект. И pname является ключом блоба в таблице. Поэтому, если вы сбрасываете все большие двоичные объекты в таблице, то ни один из них вам не нужен, но вам нужно будет придумать уникальное имя файла для каждого большого двоичного объекта.

...