【发布时间】:2017-04-25 19:19:56
【问题描述】:
我的目标是通过在插入之前检查列中的现有值来防止插入重复数据。这与在 MS SQL 中使用 'IF NOT EXISTS ()...' 的效果相同。
我无法在 Oracle 11g 中完成此操作。我了解 Oracle PLSQL 不提供相同的语句来执行此操作。请纠正我的理解。
在我的研究中,我发现“合并”是实现这一目标的一种方式。
我的 PLSQL 在下面,但是不起作用。查询结果为“0行合并”
EMP 表确实具有 ID 的 IDENTITY 列,如下表所示。
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;
EMP 表的表示如下
"EMP" TABLE
ID F_NAME L_NAME EMAIL
------- ------------ ------------ ------------
1 John Smith test@email.com
我使用 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;
【问题讨论】:
-
您正在尝试使用
EMP合并EMP??当然不会合并,因为电子邮件已经在桌面上。而且您没有针对MATCH案例的部分 -
Oracle 和 SQL Server 实际上对于此类查询具有几乎相同的语法和功能。只需使用您在 Oracle 上的 SQL Server 中使用的相同查询。如果这不起作用,请向我们展示您得到的查询和错误,通常可以通过非常小的更改来修复它。
-
@JuanCarlosOropeza 我将进一步研究 MERGE 语句以更好地理解它的构造。目的是在电子邮件地址不匹配时进行合并。
-
问题中没有PL/SQL。只有普通的 SQL
-
@RBarryYoung 添加了 IF NOT EXISTS 并收到错误,因为我现在知道这可以通过两种方式完成。