PL / SQL:决定是否在触发器中插入或更新一行,这是最好的方法吗?

时间:2018-01-15 08:30:41

标签: oracle plsql triggers sql-update sql-insert

我需要在插入检查行是否存在的每一行之前在Oracle PL / SQL(11g)中编写一个触发器:如果它不存在则创建一个新行,如果它存在则更新现有记录。

哪种方法最好?

谢谢,Gianluca

1 个答案:

答案 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