Процедура PLSQL для записи данных в файл XML - некоторые данные иногда пропускаются

У меня есть процедура PLSQL, которая считывает данные из базовой таблицы и записывает их в файл, который затем отправляет в хранилище объектов оракула. Эта процедура вызывается несколько раз в цикле через интеграцию в Oracle Integration Cloud. Пример кода процедуры представлен ниже:

      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 - данные отсутствуют, из-за чего теги неверны

Основная проблема в том, что иногда процедура работает отлично, а иногда в некоторых файлах есть такие неверные данные.

Подскажите, пожалуйста, в чем тут проблема и как ее исправить...

0 ответов

Другие вопросы по тегам