将SQL Server触发器转换为oracle触发器

问题描述 投票:0回答:1

我试图将下面显示的SQL Server触发器转换为Oracle触发器,但我得到编译时错误。

SQL Server触发器:

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;
plsql oracle11g database-migration database-trigger
1个回答
0
投票

此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

© www.soinside.com 2019 - 2024. All rights reserved.