問題の原因となっている行を特定する唯一の方法 (私が知っている) は、Oracle の「エラーをログに記録する」機能を使用することです。そうすれば insert
例外はスローされず、制約に違反する行は指定されたエラー テーブルに書き込まれます。
そのためには、まず、拒否された行を保持するログ テーブルを作成する必要があります:
EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('BD_VEHICLES_TEMP');
ERR$_BD_VEHICLES_TEMP
という名前のテーブルが作成されます
次に、ステートメントを次のように変更します:
insert into bd_vehicles_temp
select *
from bd_vehicles_temp_1
LOG ERRORS REJECT LIMIT UNLIMITED;
行が制約の検証に失敗した場合でも、ステートメントは続行されます。ステートメントが終了したら、テーブル ERR$_BD_VEHICLES_TEMP
の内容を確認できます。 エラー メッセージと値を含む、制約に違反した行について。
(編集):最初のエラーで停止したい(そしてログテーブルでそれを確認したい)場合は、 REJECT LIMIT UNLIMITED
を省略してください
詳細はマニュアルにあります:
- DBMS_ERRLOG http://docs. oracle.com/cd/B28359_01/appdev.111/b28419/d_errlog.htm#CEGBBABI
- LOG ERRORS INTO 句の場合:http ://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9014.htm#BGBEIACB