UTL_FILE fseek的功能,给予误差大的绝对偏移?

我不得不做出这样将使用fseek的读取pirticular位置数据的程序。 我要读一行数据线,并在pirticular行我必须使用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"

但随着小absolute_offset价值就像4000范围内正常工作,并挑选数据。 线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;

--------------解决方案-------------

我在我的环境跑这一点,也有这个弹出。 奇怪的是,如果我指定一个最大行lengh 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);

完美的作品。 我没有理由这一点,但它肯定看起来像一个错误。

作为变通,你可能会想尝试的DBMS_LOB使用包BFILE而非。

我在过去遇到了这个。

最大行大小是1024,除非在调用FOPEN规定(如你在第二个例子(5000)这样做。

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

分类:神谕 时间:2015-03-14 人气:6
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.409 (s). 10 q(s)