3

fseek を使用して、位置からデータを読み取るプログラムを作成する必要があります。私はデータを1行ずつ読み取る必要があり、特定の行では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 のように小さい場合は、範囲が適切に機能し、データが選択されます。fseek を使用している 15 行目でエラーが発生しました。

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);

完璧に動作します。これには正当な理由はありませんが、確かにバグのように見えます。

回避策として、代わりに sDBMS_LOBを使用してパッケージを試してください。BFILE

于 2011-01-25T21:11:33.573 に答える
0

私は過去にこれに遭遇しました。

FOPEN の呼び出しで指定されていない限り、最大行サイズは 1024 です (上記の 2 番目の例で (5000 で) 行ったように)。

オラクルは、これはバグではなく、予期された動作であると主張します。 http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm

于 2013-12-20T15:38:16.327 に答える