将 SQL 服务器触发器转换为 oracle 触发器

Convert SQL Server trigger into oracle trigger

我正在尝试将下面显示的 SQL 服务器触发器转换为 Oracle 触发器,但出现编译时错误。

SQL 服务器触发器:

CREATE TRIGGER [dbo].[triggerName]   
ON [dbo].[table] 
AFTER INSERT, UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    IF EXISTS (SELECT * FROM deleted) -- UPDATE
    BEGIN
        IF NOT (UPDATE (lastupdated))  
        BEGIN  
            UPDATE [table] 
            SET lastupdated = GETUTCDATE() 
            WHERE EventKey IN (SELECT EventKey FROM inserted);

            INSERT INTO table2 ([EventKey], [ProgramKey], [ProgramActivityKey],
                                [ParentEventKey], [ComplianceDate],
                                [CycleNumber], [Priority], [WorkPolygonKey],
                                [Shape], [IsCompleted], [IsFieldException],
                                [CompletedDate], [DueDate],
                                [IsSystemException], [FromDate], [ToDate],
                                [CrewKey], [UserKey], [UserId])
                (SELECT
                     e.[EventKey], [ProgramKey], [ProgramActivityKey],
                     [ParentEventKey], [ComplianceDate],
                     [CycleNumber], [Priority], [WorkPolygonKey],
                     [Shape], [IsCompleted], [IsFieldException],
                     [CompletedDate], [DueDate], 
                     [IsSystemException], [lastupdated], GETUTCDATE(),
                     [CrewKey], w.[UserKey], [UserId]
                 FROM
                     deleted e 
                 LEFT OUTER JOIN
                     table3 w ON e.EventKey = w.EventKey 
                 LEFT OUTER JOIN
                     [table4] u ON u.UserKey = w.UserKey);
        END;
    END;
    ELSE 
    BEGIN -- INSERT
        UPDATE [table] 
        SET lastupdated = GETUTCDATE() 
        WHERE EventKey IN (SELECT EventKey FROM inserted);
    END
END

已转换的 Oracle 触发器:

CREATE OR REPLACE TRIGGER tr_lastModified AFTER INSERT OR UPDATE  ON  Event 
FOR EACH ROW
DECLARE
v_userKey NUMBER;
v_eventKey NUMBER;

BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    IF UPDATING THEN--if exists (select * from deleted) -- UPDATE  
            IF NOT UPDATING ('lastupdated') THEN

        UPDATE Event SET lastupdated = SYS_EXTRACT_UTC(SYSTIMESTAMP) WHERE EventKey = :NEW.EventKey;

        SELECT userkey INTO v_userKey FROM WorkAssignment w WHERE w.EventKey = :OLD.EventKey LEFT JOIN User_ u ON u.UserKey = w.UserKey;

            INSERT INTO EventHistory VALUES (:OLD.EventKey,
                                                    :OLD.ProgramKey,
                                                    :OLD.ProgramActivityKey,
                                                    :OLD.ParentEventKey,
                                                    :OLD.ComplianceDate,
                                                    :OLD.CycleNumber,
                                                    :OLD.Priority,
                                                    :OLD.WorkPolygonKey,
                                                    :OLD.Shape,
                                                    :OLD.IsCompleted,
                                                    :OLD.IsFieldException,
                                                    :OLD.CompletedDate,
                                                    :OLD.DueDate,
                                                    :OLD.IsSystemException,
                                                    :OLD.FromDate,
                                                    SYS_EXTRACT_UTC(SYSTIMESTAMP),
                                                    :OLD.CrewKey,
                                                    v_userKey,
                                                    :OLD.UserId);           
      END IF;
    ELSE
            UPDATE Event SET lastupdated = SYS_EXTRACT_UTC(SYSTIMESTAMP) WHERE  EventKey = :NEW.EventKey;
  END IF;    
END;

此 SELECT 中的语法无效;我修好了:

 SELECT userkey
   INTO v_userKey
   FROM WorkAssignment w LEFT JOIN User_ u ON u.UserKey = w.UserKey
  WHERE w.EventKey = :OLD.EventKey;

此外,您似乎在任何情况下都在执行 UPDATE Event,所以 - 也许您应该将其移出 IF-THEN-ELSE