質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

2359閲覧

SQL*Loaderで同一レコードのエラーを複数出す方法

Gidemo

総合スコア10

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/04/05 12:41

OracleのSQL*Loaderで顧客からもらった20カラム、1000行程度のCSVデータの取込を行おうとしています。
しかし、データに一意制約違反や桁あふれ等のエラーが多く、もらったままでは複数のエラーが発生しています。

現在の私のやり方では同一レコードについて複数のエラーを出すことができず、
①データ取込
②A列で桁あふれエラーが出る
③A列修正
④データ取込
⑤B列で必須違反が出る
というように繰り返し作業が発生し、非常に効率が悪い状態です。

そこで質問なのですが、上記の②と⑤で出てるエラーを一回の取込で出す方法はないでしょうか?

以下、現在使用中の環境等の情報です。
・データベース
-Oracle 11g
・クライアント
-Win10 Pro
-OracleClient 11g
・設定ファイルのパラメータ
OPTIONS (ERRORS=1000)
LOAD DATA
INFILE 'ファイル名' "str '\r\n'"
APPEND
CONTINUEIF NEXT(1:1) = '#'
INTO TABLE "テーブル名"
FIELDS TERMINATED BY','
OPTIONALLY ENCLOSED BY

不足情報等があればご教授ください。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ERRORS=-1とすると無制限になります。

SQL

1OPTIONS (ERRORS=-1)

追記

「同一レコードの複数のカラムにそれぞれエラーがあった場合でも、一回の処理で全て検出する」

SQL*Loaderは高速にデータを取り込むのを目的とした処理ですから、一つでもエラー検知したら行をSKIPするのは、当然の仕様だと思います。

そうは言っても、エラーチェックも兼用出来たら、というのは理解できます。

何度も行うのが効率悪いという事ですが、1000件程度でしたらSQL*Loaderの処理にそんなに時間は掛からないので、多分CSVの編集に苦労されているのではないでしょうか。
テキストエディタは論外なので、もしエクセルでやられているとかでしたら、CSV専用のエディタを使われてはどうでしょう。
【厳選】Windows用のCSVファイルエディタ【最強のCSVエディタ】

私が良く行うのは、エラーになりようがないテーブル(キーや制約の無い全てtext属性)を用意して取り込み、そこでエラーチェックなり加工するなりを行って、本来のテーブルへ登録するようにしています。
SQLのみで行えることや、大量データの場合CSVに対してよりも高速、他のデータとの整合性チェック可、というのが利点です。

因みにエラー(チェックすべき項目)としては以下が考えられます。
・一意制約違反
・NotNull制約違反
・属性エラー(数値項目に文字)
・桁あふれ(文字なら桁数、数値ならオーバーフロー)
・エスケープ文字使用(区切り記号と同じ記号を文字列中で使用)
※最後のエスケープ文字使用についてはチェック状況に応じた臨機応変さが必要なことが多い。

投稿2018/04/05 14:38

編集2018/04/06 01:32
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Gidemo

2018/04/06 00:13

ご回答頂きありがとうございます。 ERRORS=-1として実行してみましたが、求める動作はやはりしませんでした。 私の説明が分かりづらく申し訳ないのですが、 「同一レコードの複数のカラムにそれぞれエラーがあった場合でも、一回の処理で全て検出する」 というのが求める動きになります。 SQL*Loaderの仕様なのか、同一レコード上に複数のエラーが存在しても、一つのみが検出されるのみで、全てのエラーが出力されません。 例えば、取込対象が1レコードの場合、A列で一意制約違反、B列で桁あふれを起こしていても、エラーとして検出されるのはB列の桁あふれのみとなる、といった感じです。 もちろん、B列の値を修正してから再度取り込めば、A列の一意制約違反をエラーとして検出することができますが、取込→修正→取込という作業が非常に時間も掛かるため、どうにか一括でできないか?という願いが質問の意図になります。 言葉足らずで申し訳ありませんでした。
Gidemo

2018/04/06 04:39

追記頂きありがとうございます。 >SQL*Loaderは高速にデータを取り込むのを目的とした処理ですから、一つでもエラー検知したら行をSKIPするのは、当然の仕様だと思います。 全くその通りですね。SQL*Loaderメインでエラー検出を行うことは諦めます。 >私が良く行うのは、エラーになりようがないテーブル(キーや制約の無い全てtext属性)を用意して取り込み、そこでエラーチェックなり加工するなりを行って、本来のテーブルへ登録するようにしています。 当初はご記載のように、ワークテーブルを用意し、チェックすることを想定していたのですが、リソースの関係で諦めておりました。 後出しで申し訳ないですが、今回行おうとしているのは、既存システムから新規システムへのデータ移行で、データ量もテーブルによっては数百万件~レベルのものが存在します。 ワークテーブルを使用すると一時的にでも倍のリソースが必要になるため、可能な限りワークテーブルは使用しないという方針となっておりました。 ですが、データチェックの効率を考えると、やはりワークテーブルを使用してのチェックが望ましいと思いますので、再度検討します。 丁寧にご回答頂きありがとうございました。
sazi

2018/04/06 05:07 編集

移行処理のトランザクションの単位が分割できるなら(例えばCSV単位)、ワークテーブルを一時表(ON COMMIT DELETE ROWS)で作成すれば、使用するリソースも抑えられます。
sazi

2018/04/06 05:07

あ、SQL*Loaderと同一セッションにできないか・・・ エラー自体はログ出力して、ワークテーブルは都度TRUNCATEですかね。
Gidemo

2018/04/06 05:12

確かに一時表を利用すればリソースの問題は回避できそうです。 何度もアドバイス頂きありがとうございます。
guest

0

データ量が少ないなら外部表 使っては?SELECTしてPL/SQLなど技量次第ですが、自由にチェックできます。

投稿2018/04/07 09:41

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問