Следующая хранимая процедура предназначена для сбора всех значений 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;