2010-12-03 2 views
3

필자는 pirticular 위치에서 데이터를 읽는 fseek를 사용할 프로그램을 만들어야합니다. 필자는 라인 단위로 데이터를 읽어야하고, pirticular 라인에서는 fseek를 사용하여 데이터를 읽어야합니다. 하지만 난 fseek과 및 absolute_offset을 사용하고 때 큰 크기이다는 (파일 크기가 적은 다음 조금),이 오류 Utl_file fseek 함수가 큰 절대 오프셋으로 오류를 내고 있습니까?

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

"ls"출력과 일치하는 정확한 file_length가 반환됩니까? –

답변

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

작품. 나는 이것을 정당화 할 수는 없지만 확실히 버그처럼 보입니다.

대신 BFILE을 사용하여 DBMS_LOB 패키지를 사용해 볼 수 있습니다.

0

나는 이것을 이전에 만났습니다. 당신은() 5000 위의 두 번째 예제에서 그렇게했던 것처럼 (FOPEN에 대한 호출에서 언급 된 경우를 제외하고

최대 라인 크기는 1024

그래서 오라클은 주장 할 것이다 -. 그것은 예상되는 동작, 오히려 버그보다 http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm