ユーティリティ使用時のエラー

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

KUP-04020: サポートされているバッファ・サイズ 524288 より長いレコードが <filename> で見つかりました

現象

外部表 でファイルが小さな場合にはエラーにならないが大きめなファイルを取り込もうとするとエラーになる。

原因

外部表の取り込み時に読み込みバッファのオーバーフロー

例えば Windows 上で稼働するオラクルでテキストファイルを取り込む外部表 BIG_TEXT_TABLE にてエラーが発生する場合がある。

CREATE TABLE BIG_TEXT_TABLE (
    TEXT    VARCHAR2(4000)
)
ORGANIZATION EXTERNAL (
    TYPE ORACLE_LOADER
    DEFAULT DIRECTORY external_data
    ACCESS PARAMETERS (
        RECORDS DELIMITED BY NEWLINE /** ← NEWLINE **/
    )
    LOCATION ('big_raw_file.txt')
)
select * from BIG_TEXT_TABLE where rownum <= 10
*
行1でエラーが発生しました。:
ORA-29913: ODCIEXTTABLEFETCHコールアウトの実行中にエラーが発生しました。
ORA-29400: データ・カートリッジ・エラーが発生しました
KUP-04020: found record longer than buffer size supported, 524288, in
w:\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 (
        RECORDS DELIMITED BY X'0A' /** ← LF の16進表記 **/
    )
    LOCATION ('big_raw_file.txt')
)

または、FTP で外部から入手するテキストファイルを アスキーモード で再入手する。

 


 

一覧ページへ戻る

OTN (Oracle Technology Network)によるエラーメッセージによる情報だけでは、対処に困ったエラーについてのプラクティスです。
ベスト・プラクティスというわけではないので、書いてあることに固執しないで広い視野でエラー対応してください。

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)