0

我有一个 PLSQL 过程,它从基础表中读取数据,并将其写入文件,然后将其推送到 oracle 对象存储。此过程通过 Oracle 集成云中的集成循环调用多次。示例程序代码如下:

declare
    Lv_file UTL_FILE.file_type;
    P_SubstrVal VARCHAR2(10000);
    lv_file_name VARCHAR2 (100):= file_name;
    P_Directory VARCHAR2(101) :='TEMP';
    l_columnValClob CLOB;
    P_offset NUMBER  :=1;
    P_amount NUMBER  :=3000;
    l_clobLen NUMBER :=0;
    c_value NUMBER ;
    l_cursor   SYS_REFCURSOR;
    TYPE fetched_data IS RECORD (
          xml_data   clob,
          created_date date,
          updated_date date
       );
    TYPE fetched_table IS TABLE OF fetched_data
       INDEX BY PLS_INTEGER;
    l_table_data fetched_table;
BEGIN
    BEGIN
        DBMS_CLOUD.DELETE_FILE('TEMP',file_name);
    EXCEPTION
        WHEN OTHERS THEN
            null;
    END;
    Lv_file := utl_file.fopen(P_Directory,lv_file_name,'wb');
    utl_file.put_raw(Lv_file,utl_raw.cast_to_raw('<?xml version="1.0" encoding="UTF-8"?><wd:DATA>'));
    OPEN l_cursor FOR 'SELECT XML_DATA,CREATED_DATE,UPDATED_DATE FROM (SELECT a.*, ROWNUM rnum  FROM (SELECT XML_DATA,CREATED_DATE,UPDATED_DATE FROM ' || table_name || ' order by employee_id) a WHERE ROWNUM <= ' || ending_row || ') WHERE rnum >= ' || starting_row ;
    FETCH l_cursor BULK COLLECT INTO l_table_data;
    CLOSE l_cursor;
    RECORD_COUNT := l_table_data.COUNT;
    FOR indx IN 1 .. l_table_data.COUNT
    LOOP
        P_offset := 1;
        l_columnValClob := l_table_data (indx).XML_DATA;
        l_clobLen := DBMS_LOB.GETLENGTH(l_columnValClob);
        WHILE P_offset < l_clobLen
        LOOP
           P_SubstrVal := dbms_lob.substr(l_columnValClob,P_amount,P_offset);
           utl_file.put_raw(Lv_file,utl_raw.cast_to_raw(P_SubstrVal));
           P_offset:=P_offset+P_amount;
        END LOOP;
    End loop;
    utl_file.put_raw(Lv_file,utl_raw.cast_to_raw('</wd:DATA>'));
    UTL_FILE.fclose(Lv_file);
    -- some more code
end;

我面临的问题是,有时生成的文件有一些丢失或额外的 XML 数据, - XML 的语法验证失败。示例: 错误示例图像 - XML 中的错误 - 由于标签不正确导致数据丢失

主要问题是,有时程序工作得很好,有时,某些文件有这种不正确的数据。

请告诉我这里的问题是什么,以及我们如何解决它...

4

0 回答 0