You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取与写入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:13:35