在Oracle SQL Trigger中测试主键存在

时间:2011-06-03 00:45:21

标签: sql oracle triggers

我正在尝试在SQL中编写一个触发器,并且其中的代码需要在尝试更新或插入之前确定表中是否存在条目。

我尝试过使用

IF EXISTS
UPDATE
ELSE
INSERT

UPDATE
IF @@ROWCOUNT = 0
INSERT

但它们都不起作用。我偏爱使用后者,因为我的雇主对效率很关注(嗯......呃...)因此我也不愿意使用

IF SELECT COUNT(*) = 0
UPDATE
ELSE
INSERT

有没有人知道如何解决这个问题?

-

更新:我正在尝试使用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声明......

2 个答案:

答案 0 :(得分:2)

使用MERGE代替

答案 1 :(得分: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]