2016-06-21 1 views
0

을 사용하여 Oracle 데이터베이스에서 CSV 파일로 데이터를 내보내는 동안 프로 시저를 사용하여 오라클 데이터베이스에서 CSV 파일로 데이터를 내보내는 동안 문제가 발생합니다. 데이터를 내보내는 동안 CSV 파일이 잘 리면서 "ORA-29285 - 파일 쓰기 오류"이라고 표시되는 경우가 있습니다. 여기서 문제는 파일이 모든 시간이 아니라 무작위로 잘리는 것입니다.ORA-29285 오류 프로 시저

편집 : 아래 나는 원인을 추적하는 내 머리를 당겨하고

conn := utl_file.fopen('sample_directory','output.csv','W',4096); 
for i in (select * from per_data) 
loop 
utl_file.put_line(conn,i.name||','||i.sub||','||to_char(i.start_date,'dd-mon-yy')||','||to_char(i.expire_date,'dd-mon-yy')||','||i.loc||CHR(13)); 
end loop; 
utl_file.fclose(conn);` 

내 절차에 사용되는 코드의 덩어리입니다. 누군가 나를 도울 수 있습니까?

+1

프로 시저 코드가 도움이 될 수 있습니다. 어떤 디버깅을 했습니까? 실패 할 때 작성하려고하는 데이터의 길이는 얼마입니까? –

+0

외부 링크를 코드에 붙여 넣지 말고 코드 이미지를 게시하지 말고 질문을 편집 한 다음 코드를 텍스트로 붙여 넣으십시오. –

+0

@Alex이 경우 파일 크기가 중요합니까? 출력에 수천 개의 레코드를 쓰고 있습니다. – learner1

답변

0

이 오류를 얻는 한 가지 방법은 특정 최대 줄 크기 (possibly the default 1024)로 파일을 연 다음 해당 파일에 한 줄을 더 길게 작성하는 것입니다.

당신의 경우에는 4096으로 열면 선이 그보다 더 짧습니다 (분명히).

그래서 당신은 the 32k limitation을 타격 할 수있다 : 당신이 FOPEN의 작은 크기를 지정하지 않는

버퍼 매개 변수의 최대 크기는 32767 바이트입니다. 지정되지 않은 경우, Oracle은 기본값 1024를 제공합니다. 모든 순차적 PUT 호출의 합계는 중간 버퍼 플러시없이 32767을 초과 할 수 없습니다.

홍조가없는 것 같습니다.

utl_file.put_line(conn, 
    i.name||','||i.sub||','||to_char(i.start_date,'dd-mon-yy') 
    ||','||to_char(i.expire_date,'dd-mon-yy')||','||i.loc||CHR(13), 
    true); 

또는 루프와 manually flush에 카운터를 유지 매 100 선 (또는 어떤 번호가 작동하고 당신을 위해 효율적이다) : 당신은 자동 플러시에 put_line 전화를 변경할 수 있습니다.

As noted in the documentation

: 아직 FCLOSE이 실행될 때 기록 될 데이터가 버퍼 경우 파일을 닫을 때

, 당신은 WRITE_ERROR를받을 수 있습니다.

그렇게 명시 적 플러시를 추가, 닫기 전에 당신은 플러싱되지

- true로의 autoflush 설정을 경우에도이 - 또한 예외가 아닌 fclose() 호출에 의해 발생되는 이상있는 경우,이를 방지 도움이 될 수 있습니다 에 의해 put_line() :

... 
end loop; 
utl_file.fflush(conn); 
utl_file.fclose(conn); 
+0

'utl_file.fopen (sample_directory, output.csv, 'W', 4096);'파일에 쓰는 것보다 큰 선 크기를 사용하고 있다고 생각합니다. 내 결과는 다음과 같습니다 ** Nick, F1333,19-JAN-13,19-JAN-99, IN **. 같은 스크립트를 다시 실행하면 출력 결과는 완벽합니다. – learner1

+0

OS에서 출력 할 때 줄 바꿈 문자와 캐리지 리턴 문자를 추가합니까? 얼마나 많은 기록을 쓰고 있습니까? 정확하게 동일한 출력이 간헐적으로 작동하면 이상합니다. 질문에 프로 시저 코드를 추가하여 수행중인 작업을 추측 할 필요가 없습니다. –

+0

예! 출력에 캐리지 리턴을 추가하고 있습니다. 출력에는 수천 개의 레코드 (특히 80k +)가 있습니다. 출력에 쓰는 레코드의 수에 따라 다릅니 까? 그리고 정말 이상하고 왜 다시 실행했을 때 올바른 출력을 얻었는지 알 수 없습니다. 이것은 자주 발생하는 문제입니다. – learner1