读取与写入XML文件时的文件长度差异问题排查
文件长度差异原因排查
操作过程与代码
1. 读取XML文件的PL/SQL过程
CREATE OR REPLACE PROCEDURE readxml AS l_bfile BFILE; l_clob CLOB; l_dest_offset INTEGER := 1; l_src_offset INTEGER := 1; l_char_set_id NUMBER := nls_charset_id('UTF8'); l_lang_context INTEGER := dbms_lob.default_lang_ctx; l_warning INTEGER; BEGIN l_bfile := bfilename('TEST_FOLDER', 'sample.xml'); dbms_lob.createtemporary(l_clob, cache => false); dbms_lob.open(l_bfile, dbms_lob.lob_readonly); dbms_lob.loadclobfromfile(l_clob, l_bfile, dbms_lob.getlength(l_bfile), l_dest_offset, l_src_offset, l_char_set_id, l_lang_context, l_warning); dbms_lob.close(l_bfile); -- dbms_output.put_line('converted to clob' || l_clob); write_to_file(l_clob); END readxml;
2. 写入文件的PL/SQL过程
CREATE OR REPLACE PROCEDURE write_to_file ( p_clob IN CLOB ) AS l_output utl_file.file_type; l_amt NUMBER DEFAULT 32000; l_offset NUMBER DEFAULT 1; l_length NUMBER DEFAULT nvl(dbms_lob.getlength(p_clob), 0); BEGIN dbms_output.put_line('writing the clob' || p_clob); l_output := utl_file.fopen('TEST_FOLDER', 'my_file.xml', 'wb', 32760); WHILE ( l_offset < l_length ) LOOP utl_file.put(l_output, dbms_lob.substr(p_clob, l_amt, l_offset)); utl_file.fflush(l_output); l_offset := l_offset + l_amt; END LOOP; utl_file.new_line(l_output); utl_file.fclose(l_output); END;
3. 检查文件长度的代码
DECLARE ex BOOLEAN; f_len NUMBER; b_size NUMBER; f_len1 NUMBER; b_size1 NUMBER; BEGIN utl_file.fgetattr('TEST_FOLDER', 'my_file.xml', ex, f_len, b_size); dbms_output.put_line('File Length my_file.xml : ' || to_char(f_len)); utl_file.fgetattr('TEST_FOLDER', 'sample.xml', ex, f_len1, b_size1); dbms_output.put_line('File Length sample.xml: ' || to_char(f_len1)); END; /
现象
执行后得到文件长度差异:
File Length my_file.xml :591 File Length sample.xml :590
原因分析
差异的核心原因是write_to_file过程中的这行代码:
utl_file.new_line(l_output);
utl_file.new_line会在文件末尾额外添加一个换行符(Unix/Linux系统下是1字节的\n,对应本次1字节的长度差),而原文件sample.xml的内容中并不包含这个额外的换行,因此导致新文件比原文件多1字节。
修正方案
删除write_to_file过程中的utl_file.new_line(l_output);语句,重新编译过程后执行即可让新文件长度与原文件一致。
内容的提问来源于stack exchange,提问作者Niki
相关产品推荐
相关产品推荐

