我正在尝试在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声明......
答案 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]