sql >> データベース >  >> RDS >> Oracle

Oracle JDBC:一意のキー制約をスローする行を知る方法は?

    問題の原因となっている行を特定する唯一の方法 (私が知っている) は、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 を省略してください

    詳細はマニュアルにあります:



    1. 他の列が最大であるMySQLSELECT固有の列

    2. JDBC / MySQLで動作しているTRANSACTION_REPEATABLE_READを確認するにはどうすればよいですか?

    3. WHERE句でmysqlconcat()を使用していますか?

    4. ストアドプロシージャを使用してOracleテーブルにCSVファイルをインポートする