外部テーブルがあります。そして、それらのテーブルからデータを抽出し、そのデータを他のテーブルに挿入/マージしたいと思います。
select from => insert into query または merge クエリを実行すると、データの品質が低下し、クエリが壊れる可能性があります (可能性が高い)。外部テーブルに日付として 000000 があり、データをマージするとクエリが壊れるとします。
エラー、エラーの理由、行番号、列名を記録するテーブル (たとえば) エラーテーブルにこれらのエラーを記録するにはどうすればよいですか? SQL Loader ログに表示されるのと同じように。例えば:
Record 2324: Rejected - Error on table AA_STAG_VR_01, column KS1.
ORA-01843: not a valid month
そして、クエリはむしろ壊れるべきではありません。むしろ、エラーをログに記録し、SQL ローダーで発生するように先に進みます。
出来ますか?ネットで調べてみたのですが、何も見つからないか、単に魔法の言葉を知らないだけなのかもしれません
前もって感謝します :-)
編集:わかりました、次のアプローチを使用して問題を(まあ、部分的に)解決できました。
CREATE TABLE error_table (
ora_err_number$ NUMBER,
ora_err_mesg$ VARCHAR2(2000),
ora_err_rowid$ ROWID,
ora_err_optyp$ VARCHAR2(2),
ora_err_tag$ VARCHAR2(2000)
)
INSERT INTO destination_table (column)
SELECT column FROM external_table
LOG ERRORS INTO error_table REJECT LIMIT UNLIMITED
これは私に与えます:
SELECT * FROM error_table;
----------------------------------------------------------------------------------------------------------------------------------------------------------
ORA_ERR_NUMBER$ | ORA_ERR_MESG$ | ORA_ERR_ROWID$ | ORA_ERR_OPTYP$ | ORA_ERR_TAG$ |
----------------------------------------------------------------------------------------------------------------------------------------------------------
12899 |ORA-12899: value too large for column "SYSTEM"."destination_table"."column"
ここまでは順調ですね。ただし、どのレコード番号 (external_table の行番号) でこのエラーが発生したかを知りたいです。最初の 10 レコードは問題なく、11 番目のレコードは悪かった可能性があるためです。