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