【发布时间】:2018-10-29 06:21:36
【问题描述】:
我的 student_t1 表由一个名为 image 的 blob 列组成。我编写了一个 base64 函数,可以正确地将 BLOB 转换为 CLOB。现在,我需要将此 CLOB 写入我的服务器 /u01/app/oracle/io_dir 上的 IO_DIR。
执行以下 PL/SQL 代码时,CLOB 将作为文本文件写入目录。我相信整个 CLOB 都没有输出,因为当我尝试解码图像时,图像已损坏(只有图像的上部进入)。我在一个小图像(11k)上运行它,它运行良好。我还监测到 l_pos 正在正确增加,所以它似乎正在读取 CLOB 的每一块(32kB)我做错了什么?
我正在使用 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;
【问题讨论】: