我需要在插入检查行是否存在的每一行之前在Oracle PL / SQL(11g)中编写一个触发器:如果它不存在则创建一个新行,如果它存在则更新现有记录。
哪种方法最好?
谢谢,Gianluca
答案 0 :(得分:2)
您要做的是MERGE INTO
:
MERGE INTO myTable t
USING (SELECT 'Smith' AS Name, 1 AS Id FROM DUAL) data -- put your data in here
ON (t.Id = data.Id) -- pk or other matching criteria
WHEN MATCHED
THEN
UPDATE SET t.name = data.name
WHEN NOT MATCHED
THEN
INSERT (Id, Name)
VALUES (data.Id, data.Name);
建立触发器是可能的,但没有允许/意图。你不应该这样做。
您尝试取消插入并执行其他操作。这不是一个好主意,因为很多东西:db中的隐藏逻辑,愚蠢的客户端做错了事情。 你可以用错误中止,但听起来并不像你这样想。
如果您想这样做,可以更改为更新。永远不要插入任何内容并实现触发器before update
,它会检查行是否存在:
CREATE OR REPLACE TRIGGER myTableTrigger
BEFORE UPDATE
ON myTable
FOR EACH ROW
BEGIN
-- If row doesn't exist. Insert one before the update..
END;
或者你可以走很长的路并建立一些观点: https://dba.stackexchange.com/questions/24047/oracle-abort-within-a-before-insert-trigger-without-throwing-an-exception