我的目標是通過在插入前檢查列中的現有值來防止插入重複數據。這與在MS SQL中使用'IF NOT EXISTS()...'的效果相同。防止重複值在ORACLE中插入
我無法在Oracle 11g中完成此操作。我知道Oracle PLSQL沒有提供相同的語句來執行此操作。請糾正我的理解。
在我的研究中,我發現'MERGE'是實現這一目標的一種方法。
我的PLSQL在下面,但是不起作用。 「0行合併」中的查詢結果
EMP表具有下表中所示ID的IDENTITY COLUMN。
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表的表示是下面
"EMP" TABLE
ID F_NAME L_NAME EMAIL
------- ------------ ------------ ------------
1 John Smith [email protected]
我在使用IF NOT EXISTS低於嘗試。無論proc和查詢在MS SQL工作得很好,但IF語句在Oracle 11g中後產生語法錯誤:
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