私の目標は、挿入する前に列の値を、既存のチェックにより、重複データを挿入しないようにするためです。これは、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;
あなたは 'EMPをマージしようとしています'' EMP'を使って?もちろん、テーブル上の電子メールのためにマージする必要はありません。そして、あなたは 'MATCH'ケースのセクションを持っていません。 –
OracleとSQL Serverは、実際には、この種の問合せに対してほぼ同じ構文と機能を持っています。 OracleのSQL Serverで使用したのと同じクエリを使用してください。それがうまく動作せず、クエリとエラーが表示された場合、通常は非常に小さな変更で修正できます。 – RBarryYoung
@JuanCarlosOropeza私は、それをよりよく理解するためにMERGEステートメントをさらに調査します。その目的は、電子メールアドレスが一致しなかった場合にマージすることでした。 – CodeLocked