Чтение файла с PL / SQL заканчивается ошибкой - PullRequest
0 голосов
/ 20 марта 2019

Я работаю в небольшой процедуре, которая должна прочитать файл и проверить, является ли файл пустым или не существует. Проверка работает, но я попытался реализовать чтение и выдает следующую ошибку:

ORA-29284: file read error
ORA-06512: at "SYS.UTL_FILE", line 106
ORA-06512: at "SYS.UTL_FILE", line 746
ORA-06512: at "HCM_ESTRUCTURES", line 23
ORA-06512: at line 3

Мой код:

CREATE OR REPLACE PROCEDURE hcm_estructures AS
  /*-Files validation variables-*/
  l_file_exists BOOLEAN;
  l_file_len    NUMBER;
  l_blocksize   BINARY_INTEGER;
  /*Variables read file*/
  v_archivo utl_file.file_type;
  v_linea clob;
  v_path varchar2(100):= 'PREPROCESSOR_DIRECTORY';
BEGIN
  utl_file.fgetattr(
    location    => v_path,
    filename    => 'Worker_19032019.dat',
    fexists     => l_file_exists,
    file_length => l_file_len,
    block_size  => l_blocksize);
   if l_file_exists then
    if l_file_len > 0 then
      --dbms_output.put_line('The file will read correctly');
      v_archivo := utl_file.fopen ('PREPROCESSOR_DIRECTORY', 'Worker_19032019.dat', 'r',32767);
      loop
         utl_file.get_line (v_archivo, v_linea);
         dbms_output.put_line (v_linea);
      end loop;
      --utl_file.fclose(v_archivo);
    else
      dbms_output.put_line('The file is empty');
    end if;
  else
    dbms_output.put_line('The file does not exists');
  end if;
END;

Процедура печатает только часть содержимого файла, а затем показывает ошибку.

1 Ответ

0 голосов
/ 21 марта 2019

UTL_FILE имеет ограничение на длину данных. Похоже, что вы читаете относительно большой файл, поэтому может потребоваться тип данных CLOB. Можете ли вы переписать свой код, чтобы заменить utl_file утилитой DBMS_LOB. Нижеприведенный подход должен устранить ошибку,

  1. Используйте DBMS_LOB.LoadCLOBFromFile для чтения данных в переменную CLOB. Хранение файлов в поле CLOB базы данных Oracle
  2. Когда данные передаются в переменную CLOB, используйте substr (v_clob, 1,32767), чтобы прочитать 32767 символов, продолжайте, пока не достигнете длины v_clob.
...