Cod*_*ked 0 sql oracle merge plsql
我的目标是通过在插入之前检查列中的现有值来防止插入重复数据。这与在 MS SQL 中使用“IF NOT EXISTS ()...”的效果相同。
我无法在 Oracle 11g 中完成此操作。我了解 Oracle PLSQL 不提供相同的语句来执行此操作。请纠正我的理解。
在我的研究中,我发现“合并”是实现这一目标的一种方式。
我的 PLSQL 在下面,但是不起作用。查询结果为“0 行合并”
EMP 表确实具有 ID 的 IDENTITY COLUMN,如下表所示。
MERGE INTO EMP E
USING
(SELECT ID, EMAIL FROM EMP WHERE EMAIL = 'test@email.com') T
ON (E.EMAIL = T.EMAIL)
WHEN NOT MATCHED THEN
INSERT
(
F_NAME
, L_NAME
, EMAIL
)
VALUES
(
'Employee'
, 'Test'
, 'ZZZZ@email.com'
);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
EMP 表的表示如下
"EMP" TABLE
ID F_NAME L_NAME EMAIL
------- ------------ ------------ ------------
1 John Smith test@email.com
Run Code Online (Sandbox Code Playgroud)
我使用 IF NOT EXISTS 的尝试如下。proc 和 query 在 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;
Run Code Online (Sandbox Code Playgroud)
也许是这样的?
ALTER TABLE EMP ADD CONSTRAINT NO_DUPLICATE UNIQUE(ID,F_NAME,L_NAME,EMAIL);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6870 次 |
| 最近记录: |