2017-06-15 13 views
1

重複キーエラーの後に選択への挿入を続行する方法があるかどうかを知りたい場合。意味:私は例外を無視して、次のレコードを挿入し続けたいと思います。 私はignore_row_on_dupkey_indexに精通していますが、私が知る限り、ヒントは本番環境で使用すべきではありません。選択重複キーエラー(pl/sql)への挿入を無視する

いくつか: 1.クエリは、何百万ものレコードを空のテーブルに挿入します。 2.パフォーマンスへの影響が小さい良いソリューションを好むでしょう。

おかげで、 アレックス

IGNORE_ROW_ON_DUPKEY_INDEXを使用するコードの例:

CREATE TABLE customers 
(customer_id number(10) NOT NULL, 
    customer_name varchar2(50) NOT NULL, 
    city varchar2(50), 
    CONSTRAINT customers_pk PRIMARY KEY (customer_id) 
); 


CREATE TABLE customers_2 
(customer_id number(10) NOT NULL, 
    customer_name varchar2(50) NOT NULL, 
    city varchar2(50) 

); 

insert into customers_2 values(1,'A','TLV'); 
insert into customers_2 values(2,'B','TLV'); 
insert into customers_2 values(2,'C','TLV'); 
insert into customers_2 values(3,'C','TLV'); 


SELECT * FROM customers_2 

insert /*+ ignore_row_on_dupkey_index(customers, customers_pk) */ 
into customers select * from customers_2 

select * from Customers; 
+0

procで作業しています。私は問題が何かを得ることができない –

+0

オラクルによると、ヒントには問題と既知のバグがあります。したがって、これを本番環境で使用すべきではないので、私は同様の解決策を探しています。 –

答えて

0

私が知っているが、ヒントは、プロダクション環境では使用しないでくださいされています。

パフォーマンスチューニングのヒントについては、お勧めします。しかし、ignore_row_on_dupkey_index()は他のヒントと似ていません。セマンティックな効果があり、実際にクエリの動作を変更します。したがって、それがアドホックなクエリか、OLTPからデータを取り出してDWH DBにロードする場合、私は個人的にそれを使うことで何も問題はないと見ています。 しかし、好ましい方法はinsert文のlog errors節を使用することです。実際に "悪い"行を記録して後でそれらを期待できるようにします。ここに例があります:

create table t1(
    c1 number constraint t1_pk primary key 
); 

-- create errors logging table 
exec dbms_errlog.create_error_log(dml_table_name=>'T1'); 

-- our query 
insert into t1 
    select 1 
    from dual 
    connect by level <= 3 
    log errors reject limit unlimited; 

    1 row created. 

-- "good rows" 
select * 
    from t1 

     C1 
---------- 
     1 
1 row selected. 

-- "bad rows" 

column ora_err_mesg$ format a30 
column c1 format a10 

select ora_err_mesg$ 
     , c1 
    from err$_t1 

    ORA_ERR_MESG$     C1   
------------------------------ --------- 
ORA-00001: unique constraint (... 1 
ORA-00001: unique constraint (... 1 
3

まず、この特定のヒントignore_row_on_dupkey_indexは、残りのヒントとは異なります。

あなたが言及している制限は、通常、パフォーマンスチューニングと関係があるヒントに関係しています。これらのヒントは、最後の手段であると考えられています。

これは具体的なヒントのケースではないと思います。

here、及びhere参照)しかしながら、同じ結果もmerge

merge into "customers" a 
using 
( 
    select * from customers_2 
) b 
on (a.customer_id = b.customer_id) 
when not matched then 
    insert (customer_id , customer_name,city) 
    values (b.customer_id , b.customer_name, b.city); 

で達成することができ、LOG ERRORS REJECT LIMIT UNLIMITEDアプローチは、このSO postに記載されています。

+1

MERGEは正常に機能したい場合に便利です。どのレコードが失敗したかを知りたい場合は、LOG ERRORSソリューションが有効です。 – BriteSponge

関連する問題