3

我必须制作一个程序,使用 fseek 从特定位置读取数据。我必须逐行读取数据,在特定行中我必须使用 fseek 读取数据。但是当我使用 fseek 并且 absolute_offset 的大小很大(比文件大小小一点)时,它会发出这个错误

ORA-29284: file read error
ORA-06512: at "SYS.UTL_FILE", line 219
ORA-06512: at "SYS.UTL_FILE", line 1145
ORA-06512: at line 15"

但是像 4000 范围这样的小 absolute_offset 值可以正常工作并选择数据。第 15 行我正在使用 fseek 给出错误。

DECLARE
  lv_utl UTL_FILE.FILE_TYPE;
  v_buff VARCHAR2(2000);
  l_exists boolean;
  l_block VARCHAR2(2000);
  l_file_length number;
  v_line varchar2(5000);
BEGIN
  UTL_FILE.fgetattr('/d04/data/edi/inbound','POO0001.dat',l_exists,l_file_length,l_block);
  lv_utl := UTL_FILE.FOPEN('/d04/data/edi/inbound','POO0001.dat','R');
  --utl_file.get_line(lv_utl,v_line,50);
  --dbms_output.put_line(v_line);
  --l_file_length:=length();
  dbms_output.put_line(l_file_length);
  utl_file.fseek(lv_utl,1261061);
  utl_file.get_line(lv_utl,v_buff,100);
  dbms_output.put_line(v_buff);
  --lv_msg_txt := 'empno ename job manager hiredate commission salary department_no';
  --UTL_FILE.PUT_LINE(lv_utl,lv_msg_txt);
  --UTL_FILE.PUT_LINE(lv_utl,'------------------------------------------------------------------------------------');
  --UTL_FILE.PUT_LINE(lv_utl,' ');
  --UTL_FILE.FCLOSE(lv_utl);
END;
4

2 回答 2

1

我在我的环境中运行了这个,也弹出了这个。奇怪的是,如果我指定一个最大行长度,FOPEN它似乎可以正常工作。

lv_utl := UTL_FILE.FOPEN('/d04/data/edi/inbound','POO0001.dat','R');

不起作用,但是

lv_utl := UTL_FILE.FOPEN('/d04/data/edi/inbound','POO0001.dat','R',5000);

完美运行。我没有理由这样做,但它确实看起来像一个错误。

作为一种解决方法,您可能想尝试使用s 来代替该DBMS_LOB包。BFILE

于 2011-01-25T21:11:33.573 回答
0

我过去遇到过这种情况。

最大行大小为 1024,除非在对 FOPEN 的调用中指定(正如您在上面的第二个示例中所做的那样(使用 5000)。

所以甲骨文会争辩 - 这是预期的行为,而不是错误。 http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm

于 2013-12-20T15:38:16.327 回答