2017-04-25 22 views
0

私の目標は、挿入する前に列の値を、既存のチェックにより、重複データを挿入しないようにするためです。これは、MS SQLで 'IF NOT EXISTS()...'を使用するのと同じ効果になります。はORACLEに重複値のINSERTを防止

私は、Oracle 11gで、これを達成することができません。私はOracle PLSQLがそうするために同じステートメントを提供していないことを理解しています。私の理解を訂正してください。私の研究では

私は「MERGE」はこの目標を達成するための方法であることがわかってきました。

マイPLSQLは以下の通りです、しかし、動作しません。でクエリ結果

EMP表は、以下の表に示されているIDのID列を持っている「0行がマージ」。

MERGE INTO EMP E 
USING 
(SELECT ID, EMAIL FROM EMP WHERE EMAIL = '[email protected]') T 
ON (E.EMAIL = T.EMAIL) 
WHEN NOT MATCHED THEN 
INSERT 
(
    F_NAME 
    , L_NAME 
    , EMAIL 
) 
VALUES 
(
    'Employee' 
    , 'Test' 
    , '[email protected]' 
); 
COMMIT; 

EMP表の表現は、NOTが存在する場合、使用時

"EMP" TABLE 
    ID  F_NAME   L_NAME   EMAIL 
    ------- ------------ ------------ ------------ 
    1  John   Smith   [email protected] 

私の試みの下で以下です。どちらもPROCとクエリは、MS SQLでうまく動作しますが、Oracle 11gのIF文の後に構文エラーを生成します。

CREATE OR REPLACE PROCEDURE "SPADDUPDATEEMP" 
(
    P_FNAME IN EMP.F_NAME%TYPE 
    , P_LNAME IN EMP.L_NAME%TYPE 
    , P_EMAIL IN EMP.EMAIL%TYPE 
) 
AS 
IF NOT EXISTS (SELECT * FROM EMP WHERE EMAIL = P_EMAIL) 
BEGIN 
INSERT INTO EMP 
(
    F_NAME 
    , L_NAME 
    , EMAIL 
) 
VALUES 
(
    P_FNAME 
    , P_LNAME 
    , P_EMAIL 
) 
END; 
COMMIT; 
+2

あなたは 'EMPをマージしようとしています'' EMP'を使って?もちろん、テーブル上の電子メールのためにマージする必要はありません。そして、あなたは 'MATCH'ケースのセクションを持っていません。 –

+1

OracleとSQL Serverは、実際には、この種の問合せに対してほぼ同じ構文と機能を持っています。 OracleのSQL Serverで使用したのと同じクエリを使用してください。それがうまく動作せず、クエリとエラーが表示された場合、通常は非常に小さな変更で修正できます。 – RBarryYoung

+0

@JuanCarlosOropeza私は、それをよりよく理解するためにMERGEステートメントをさらに調査します。その目的は、電子メールアドレスが一致しなかった場合にマージすることでした。 – CodeLocked

答えて

1

あなたがマークされた答えのように同じことをやってますがMERGE文で、あなたがそのようにクエリ書き換えなければならない場合:

MERGE INTO EMP E 
USING 
(SELECT 'Employee'  AS F_NAME 
     ,'Test'   AS L_NAME 
     ,'[email protected]' AS EMAIL 
    FROM dual) T 
ON (E.EMAIL = T.EMAIL) 
WHEN NOT MATCHED THEN 
INSERT 
(
    F_NAME 
    ,L_NAME 
    ,EMAIL 
) 
VALUES 
(
    T.F_NAME 
    ,T.L_NAME 
    ,T.EMAIL 
); 
1

使用:このような

INSERT INTO emp(
    F_NAME 
    , L_NAME 
    , EMAIL 
) 
SELECT 
    'Employee' 
    , 'Test' 
    , '[email protected]' 
FROM dual 
WHERE NOT EXISTS (
    SELECT 1 FROM emp WHERE EMAIL = '[email protected]' 
); 
+0

パーフェクト。答えとしてマーク。 – CodeLocked

2

多分何か?

ALTER TABLE EMP ADD CONSTRAINT NO_DUPLICATE UNIQUE(ID,F_NAME,L_NAME,EMAIL); 

Source

+1

これにより、エラーが発生します。問題を解決しないでください。この問題を回避する挿入物を提供したい –

+0

これは、主キーの重複挿入を防止します。これを防ぐためにインクリメント機能を使用しています。私の目標は、重複するデータが挿入されないようにすることです。 – CodeLocked

+0

任意のフィールドに一意の制約を追加できます。列に重複がないことを保証する唯一の方法です。 – unleashed

関連する問題