2011-09-15 8 views

答えて

8

あなたはこのために、Oracleのエラーログ機能を使用することができます。

まずあなたが後で無視行が含まれるテーブルを作成する必要があります。

EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('YOUR_TABLE', 'YOUR_TABLE_ERROR_LOG'); 

という名前のテーブルのYOUR_TABLE_ERROR_LOGと呼ばれるテーブルを作成することYOUR_TABLE(明らかにこれは一度だけ行う必要があります)。あなたのUPDATEを実行すると

あなたはLOG ERRORS句を追加する必要があります。

UPDATE your_table 
    SET ... 
WHERE ... 
LOG ERRORS INTO YOUR_TABLE_ERROR_LOG ('UPDATE running at '||to_char(sysdate, 'yyyy-MM-dd HH24:MI:SS')) 
REJECT LIMIT UNLIMITED; 

にエラーが発生したアクションを識別するのに役立ち、任意の値が指定された文字列。

更新後、テーブルYOUR_TABLE_ERROR_LOGを照会して、発生したエラーとその理由を確認できます。エラーに関心がない場合は、後でエラーログテーブルを切り捨ててください。この目的のために使用することができCHANGE_DUPKEY_ERROR_INDEXという名前の新しいヒントがあるのOracle 11.2以降
http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_10008.htm#BCEFBFCD

編集 2014年10月27日

:詳細については

は、マニュアルを参照してください。私はこれを試みたことはありません。マニュアルで

詳細:INSERT操作について http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#CHDIFFJE

IGNORE_ROW_ON_DUPKEY_INDEXという名前の同様のヒントがあります:
http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#CHDEGDDG

いくつかの例は:

0

いいえ(Oracleは大きい)とはっきりと言うのは難しいですが、15年間のデータベースプログラミングでは、これほどOracleのような機能は見たことがありません。制約を無効にすることはできますが、これはここで達成しようとしているのと同じことではありません。

行ごとに更新する表を処理するPL/SQLを作成し、更新を試行し、エラーを取り除く方法があります。それは効率的ではありませんが、うまくいくでしょう。しかし、私が想像することのできるすべてのシナリオでは(非常に複雑なテーブルがない限り)、更新クエリを記述して制約を回避する適切なサブクエリを含めることができます。正確な戦略は、テーブルとクエリに依存します。

関連する問題