【问题标题】:Reading file with PL / SQL ends with error使用 PL/SQL 读取文件以错误结束
【发布时间】:2019-08-11 11:16:21
【问题描述】:

我在一个小程序中工作,该程序应该读取文件并验证文件是否为空或不存在。验证有效,但我试图实现读取,它抛出了以下错误:

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;

程序只打印文件的一部分内容,然后显示错误。

【问题讨论】:

  • 当你读到文件末尾时,你应该得到“ORA-01403: no data found”...文件有多大,有多少被读取/显示(即如何许多成功的read_line 调用在失败之前就已经存在),它包含什么样的数据——尤其是在失败点附近?文件中一行的最大长度是多少 - 可以超过 32767 个字符吗?

标签: stored-procedures plsql oracle11g utl-file


【解决方案1】:

UTL_FILE 对数据的长度有限制。似乎您正在读取相对较大的文件,因此可能需要 CLOB 数据类型。 您可以重写代码以使用 DBMS_LOB 实用程序替换 utl_file。下面的方法应该可以解决错误,

  1. 使用 DBMS_LOB.LoadCLOBFromFile 将数据读取到 CLOB 变量。 Storing Files in Oracle DB's CLOB field
  2. 一旦数据到达 CLOB 变量,使用 substr(v_clob,1,32767) 读取 32767 个字符,继续 substr 直到达到 v_clob 的长度。

【讨论】:

    猜你喜欢
    • 2020-09-21
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多