티스토리 뷰

■현상

외부테이블에서 파일이 작은 경우에는 에러가 되지 않지만 큰 파일을 가져오려고 하면 에러가 된다.

KUP-04020: found record longer than buffer size supported, 524288

 

■원인

EXTERNAL TABLE(외부 테이블)을 이용하여 파일을 읽을 때 읽기 버퍼 오버플로

예를 들어 Windows에서 실행되는 오라클에서

텍스트 파일을 캡처하는 외부 테이블 BIG_TEXT_TABLE에서 오류가 발생할 수 있다.

CREATE TABBLE BIG_TEXT_TABLE(
	TEXT VARCHAR2(4000)
)
ORGANIZATION
EXTERNAL(
	TYPE
    ORACLE_LOADER
    DEFAULT DIRECTORY external_data
    ACCESS PARAMETERS(
    	DELIMITED BY KEYLINE /** ← NEWLINE*/
    )
    LOCATION ('big_raw_file.txt')
)

 

SELECT * FROM BIG_TEXT_TABLE WHERE ROWNUM <= 10
*
1행에서 에러가 발생했습니다 : 
ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error
KUP-04020: found record longer than buffer size supported, 524288, in
C:\ext_dir\big_raw_file.txt
*

레코드 구분자가 NEWLINE이라는 지정이지만, Windows에서는 CR+LF이다.

이때 UNIX계의 시스템으로부터 FTP 등으로 '바이너리 모드'로 취득한 텍스트 파일 'big_raw_file.txt'의 개행코드가 

LF의 경우에 CR+LF는 파일에서 찾을 수 없다.

따라서 1레코드(1토큰)의 취득에 READSIZE의 버퍼를 초과한다.(디폴트 값 : 512KB)

CR+LF와 LF의 차이는 파일의 바이트 사이즈가 다른 것만으로 보통의 에디터로 열어봐도

차이를 모르기 때문에 눈치채기 어렵다.

 

■대응

외부테이블을 다음과 같이 LF를 레코드 구분자로 다시 정의하여 검색이 파일의 끝까지 도달하지 않도록 설정한다.

CREATE TABLE BIG_TEXT_TABLE (
	TEXT VARCHAR2(4000)
)
ORGANIZATION EXTERNAL (
	TYPE ORACLE_LOADER
    DEFAULT DIRECTORY external_data
    ACCESS PARAMETERS (
    	RECOREDS DELIMITED BY X 'OA' /** LF 16진수 표기 */
    )
    LOCATION('big_raw_file.txt')
)

또는 FTP를 통해 외부에서 얻은 텍스트 파일을 아스키 모드로 다시 가져온다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함