Utl_file fseek函数给出大绝对偏移量的错误?

时间:2010-12-03 12:20:35

标签: oracle plsql plsqldeveloper

我必须制作一个程序,使用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;

2 个答案:

答案 0 :(得分: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);

完美无缺。我没有理由这样做,但它确实看起来像一个bug。

作为解决方法,您可能希望使用DBMS_LOB来尝试BFILE包。

答案 1 :(得分:0)

我过去遇到过这种情况。

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

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