1: CLOB超过2的15次方时,隐式字符转换会失效,导致无法拼接数字至CLOB
我用如下脚本做了测试,当clob超过32767的时候拼接数字就是出现问题.隐形字符转换失效.需要对数字进行转换才能拼接成功,32767应该是clob一个存储块的大小吧.
具体原因还需要查阅clob相关文档.有更多测试请补充.
DECLARE
l_buff CLOB;
i NUMBER := 0;
BEGIN
WHILE i <= 40000LOOP
BEGIN
IF i =32768THEN
l_buff :=l_buff || '1';
ELSE
l_buff :=l_buff || 1;
ENDIF;
EXCEPTION
WHENOTHERSTHEN
dbms_output.put_line(i);
EXIT;
END;
i := i + 1;
ENDLOOP;
END;
2:CLOB写入文件,如果不超过一定的2的15次方,可以直接把CLOB作为VARCHAR2直接写入文件.
但是需要注意写入文件时文件buff大小同样不能超过2的15次方.超过的部分无法写入.需要定时进行buff写入
FUNCTION clob_to_file(o_error_message IN OUT rtk_errors.rtk_text%TYPE,
o_clob_buff IN OUT CLOB,
o_file IN OUT utl_file.file_type)
RETURN BOOLEAN IS
l_program VARCHAR2(255) := 'cmx_zpwfepos_pub_pkg.clob_to_file';
n_offset INTEGER;
n_clob_size INTEGER;
v_buf VARCHAR2(4000);
v_buf_long INTEGER := 1000;
BEGIN
n_clob_size := dbms_lob.getlength(o_clob_buff);
n_offset := 1;
WHILE n_offset <= n_clob_size LOOP
v_buf := dbms_lob.substr(lob_loc => o_clob_buff,
amount => v_buf_long,
offset => n_offset);
utl_file.put(o_file, v_buf);
utl_file.fflush(v_file);
n_offset := n_offset + v_buf_long;
END LOOP;
RETURN TRUE;
EXCEPTION
WHEN OTHERS THEN
o_error_message := sql_lib.create_msg('PACKAGE_ERROR',
SQLERRM,
l_program,
to_char(SQLCODE));
RETURN FALSE;
END clob_to_file;