2011-06-03 46 views
1

我试图在SQL中编写一个触发器,并且在尝试更新或插入之前,需要确定表中是否存在条目。Oracle SQL触发器中主键存在测试

我一直在使用这两种

IF EXISTS 
UPDATE 
ELSE 
INSERT 

而且

UPDATE 
IF @@ROWCOUNT = 0 
INSERT 

尝试,但都没有工作。我偏爱使用后者,因为我的雇主迷,效率(嗯...咄...)因为这个原因,我也不愿意使用

IF SELECT COUNT(*) = 0 
UPDATE 
ELSE 
INSERT 

是否有人知道任何方法来解决这个?

-

UPDATE:我想用MERGE,但我收到几个错误...

MERGE INTO [tableName] AS Target 
USING (SELECT :NEW.PIDM) AS Source (PIDM) 
ON (Target.PIDM = Source.PIDM) 
WHEN MATCHED THEN 
    [UPDATE STATEMENT] 
WHEN NOT MATCHED THEN 
    [INSERT STATEMENT] 

这给了我一个错误抱怨说我失踪的using关键字,以及另一个抱怨WHEN语句...

+0

可能你的应用程序有多个用户同时连接?如果是这样,这些方法都不会起作用。您需要某种方式来序列化对更新的访问(例如,唯一约束或数据库锁定)。 – 2012-09-24 03:53:47

回答

2

使用MERGE代替

+0

我想说它会翻倒,但我的代码打破了评论 - 我将编辑问题... – 2011-06-03 01:24:16

1

在PL/SQL,你会使用SQL%ROWCOUNT代替@@ROWCOUNT

UPDATE (...); 
IF SQL%ROWCOUNT = 0 THEN 
    INSERT (...); 
END IF; 

或者,你可以使用SQL%NOTFOUND,我个人认为是比较容易理解的意图:

UPDATE (...); 
IF SQL%NOTFOUND THEN 
    INSERT (...); 
END IF; 

对于MERGE命令时,Oracle syntax略不同于@zerkms链接到的SQL Server。尤其是,您应该将“AS”一词留在表别名之外,并且不应在“USING”子句之后列出列。另外,在Oracle SQL中,FROM子句是强制性的。您可以使用DUAL table来模仿SQL Server的行为。把它放在一起(这是未经测试):

MERGE INTO tableName Target 
USING (SELECT :NEW.PIDM FROM DUAL) Source 
ON (Target.PIDM = Source.PIDM) 
WHEN MATCHED THEN 
    [UPDATE STATEMENT] 
WHEN NOT MATCHED THEN 
    [INSERT STATEMENT]