Tihiroのストレスフリーな生活

少しだけ頭使って後は根性

OracleのSQL*Loaderで発生したエラーと対応。

概要

タイトルの通り、OracleSQL*Loaderの実行中に発生したエラーと、その対応についての記事です。 ぶっちゃけると、自分用のメモです。

環境は

  • Oracle11g(R2)

です。

imp時のエラー

エラーメッセージ

TERMINATEDとENCLOSEDフィールドに続く終了記号がありません。

原因

囲み文字、区切り文字に設定している文字が、データ内に存在しているかもしれない。例えば、カンマ区切りなのにデータ内にカンマが存在する、とか。

対応

データ内の囲み文字、区切り文字を除去する。


エラーメッセージ

SQL*Loader-350: 行6に構文エラーがあります。"("ではなくend-of-fileが見つかりました

原因

コントロールファイルの構文エラー。フィールド・リストが見つからない模様。

対応

リファレンス(https://docs.oracle.com/cd/E16338_01/server.112/b56303/ldr_control_file.htm)とにらめっこして構文エラーを見つける。最小の構成にしてエラーが発生するかを確認、など。


エラーメッセージ

レコードnnn: 拒否されました。- 表xxxでエラーが発生しました。 ORA-01861: リテラルが書式文字列と一致しません

原因

コントロールファイル内のフィールド・リストに記述されているDATE型カラムに書式文字列が設定されていない。

対応

コントロールファイル内のフィールド・リストに記述されているDATE型カラムに書式文字列を設定する。

例えば

LOAD DATA
INFILE 'imp.txt'
APPEND
INTO TABLE imp
FIELDS TERMINATED BY ","
(
date_col 
)

LOAD DATA
INFILE 'imp.txt'
APPEND
INTO TABLE imp
(
date_col DATE "YYYYMMDD"
)

とする。


エラーメッセージ

IMP-00015: 次の文は、オブジェクトがすでに存在するため失敗しました: "CREATE TABLE "テーブル名" ("カラム名" VARCHAR2(256) NOT NULL ENABLE, "

原因

インポートしようとしているテーブルが存在する。

対応

impにignoreオプション(ignore=y)をつける。

例えば

imp user_id/pass@sid TABLES=テーブル名 FILE=imp.dmp ignore=y

のように。


エラーメッセージ

レコード1: 拒否されました。- 表{テーブル名},列{カラム名}"5"でエラーが発生しました。 論理レコードが終了する前に列が見つかりませんでした。(TRAILING NULLCOLSを使用)

原因:

最終列がNULLのデータがある。

対応

コントロールファイルにTRAILING NULLCOLS句を追加する。

例えば

LOAD DATA
INFILE 'imp.txt'
APPEND
INTO TABLE imp
(
date_col 
)

LOAD DATA
INFILE 'imp.txt'
APPEND
INTO TABLE imp
TRAILING NULLCOLS
(
date_col DATE "YYYYMMDD"
)

とする。


exp時のエラー

エラーメッセージ

EXP-00091: 不審な統計をエクスポートしています。 EXP-00091: 不審な統計をエクスポートしています。 エクスポートは正常に終了しましたが、警告が発生しました。

原因

よく分かりません。

エクスポート時に特定のテーブルのみをエクスポートしているため、統計情報の整合性がとれていないことが原因?

対応

expにstatisticsオプション(statistics=none)をつける。

exp user_id/pass@sid TABLES= FILE=exp.dmp statistics=none

のように。