моя таблица student_t1 состоит из столбца BLOB-объектов с именем image.Я написал функцию base64, которая правильно конвертирует BLOB в CLOB.Теперь мне нужно записать этот CLOB в мой IO_DIR
на моем сервере /u01/app/oracle/io_dir
.
Когда выполняется следующий код PL / SQL, CLOB записывается в каталог в виде текстового файла.Я полагаю, что весь CLOB не выводится, хотя, потому что, когда я пытаюсь декодировать, изображение искажается (входит только верхняя часть изображения).Я запустил его на маленьком изображении (11k), и он работал нормально.Я также отслеживал, что l_pos правильно увеличивается, поэтому кажется, что он читает каждый кусок CLOB (32 КБ). Что я делаю не так?
Я использую Oracle 11g Express Edition (XE) и SQL Developer.Вот ошибка и код
create or replace PROCEDURE c2F
IS
p_filename VARCHAR2(100);
p_dir VARCHAR2(100) := 'IO_DIR';
c_amount CONSTANT BINARY_INTEGER := 32767;
l_buffer VARCHAR2(32767);
l_chr10 PLS_INTEGER;
l_clobLen PLS_INTEGER;
l_fHandler sys.UTL_FILE.FILE_TYPE;
l_pos PLS_INTEGER := 1;
v_blob BLOB;
p_clob CLOB;
BEGIN
dbms_output.put_line('Start Time: ' || TO_CHAR(sysdate,('YYYY/MM/DD hh24:Mi:ssss')));
FOR i IN
(SELECT student_no,
image v_blob,
encdec_base64.encode_base64(image) p_clob
FROM student_t1
WHERE student_no =200601022
) loop
IF (dbms_lob.isopen(i.p_clob) = 0) THEN
dbms_lob.open(i.p_clob,dbms_lob.lob_readonly);
END IF;
l_pos := 1;
p_filename := i.student_no || '.txt';
l_clobLen := DBMS_LOB.GETLENGTH(i.p_clob);
l_fHandler := sys.UTL_FILE.FOPEN(p_dir, p_fileName,'WB',c_amount);
l_buffer := DBMS_LOB.SUBSTR(i.p_clob, c_amount, l_pos);
WHILE l_pos < l_clobLen LOOP
l_buffer := DBMS_LOB.SUBSTR(i.p_clob, c_amount, l_pos);
EXIT WHEN l_buffer IS NULL;
UTL_FILE.put_raw(l_fHandler,utl_raw.cast_to_raw(l_buffer));
l_pos := l_pos + LEAST(LENGTH(l_buffer)+1,c_amount);
UTL_FILE.FFLUSH(l_fHandler);
END LOOP;
END LOOP;
sys.UTL_FILE.FCLOSE(l_fHandler);
EXCEPTION
WHEN OTHERS THEN
IF UTL_FILE.IS_OPEN(l_fHandler) THEN
UTL_FILE.FCLOSE(l_fHandler);
END IF;
RAISE;
dbms_output.put_line('End Time: ' || TO_CHAR(sysdate,('YYYY/MM/DD hh24:Mi:ssss')));
END;