1

次のようなストアドプロシージャがあります。

BEGIN
  INSERT INTO result_table
  (SELECT (...) FROM query_table);
EXCEPTION
  WHEN DUP_VAL_ON_INDEX THEN
    NULL;
END;

SELECTステートメントに複数のパラメーターを渡すループで実行しています。場合によっては、値の一部が重複する可能性があるため、DUP_VAL_ON_INDEX例外をキャッチする必要があります。

私の質問は、SELECTステートメントがより多くの行を返し、そのうちの1つだけが*result_table*にすでに存在する場合fです。元。

1 'A'
2 'B'
3 'C'

そして、最初の行(1'A')はすでにテーブルにありますが、存在しない他の行(上記の場合から2番目と3番目)が挿入されますか?または、それらのどれも挿入されませんか?

それらのどれも挿入されないのではないかと心配しています(そして私のテストケースはそれを部分的に確認しています)...もしそうなら、私はどのオプションが望ましい行動を達成する必要がありますか?上記の構造を使用して、主キーに違反しない行を挿入する良い方法はありますか?

4

3 に答える 3

2

MERGEステートメントを使用できます。レコードが存在しない場合は挿入し、すでに存在する場合は何もしません。

http://psoug.org/reference/merge.html

于 2013-02-02T09:54:43.700 に答える
2

そうです、1つのレコードが制約に違反している場合、何も挿入されません。やる

INSERT INTO result_table
(SELECT (...) FROM query_table a WHERE NOT EXISTS
(SELECT NULL FROM result_table b WHERE b.b_unique_key = a.b_unique_key)
)

別のオプションは、エラーログを使用することです

INSERT INTO result_table
SELECT ... FROM query_table 
LOG ERRORS INTO err$_dest ('INSERT') REJECT LIMIT UNLIMITED;

注:このクエリを実行する前に、エラーテーブルを作成する必要があります。

于 2013-02-01T15:38:43.387 に答える
0

11gを使用している場合は、ignore_row_on_dupkey_indexヒントを使用してエラーを抑制することができます。

create table tab (id integer);

alter table tab add constraint tab_pk primary key (id);

insert into tab
  select rownum from dual connect by level <= 1;

1 rows inserted.
        ID
----------
         1 

SELECT * FROM tab;

insert into tab
  select rownum from dual connect by level <= 3;

SQL Error: ORA-00001: unique constraint (CAM_OWNER.TAB_PK) violated

insert /*+ ignore_row_on_dupkey_index(tab, tab_pk) */into tab
  select rownum from dual connect by level <= 3;

SELECT * FROM tab;

2 rows inserted.
        ID
----------
         1 
         2 
         3 
于 2013-02-01T15:43:30.610 に答える