【问题标题】:Creating a Trigger on Oracle在 Oracle 上创建触发器
【发布时间】:2016-05-31 06:15:42
【问题描述】:

这是在 Oracle 11 上完成的,我正在尝试创建一个触发器,如果​​传入满足某些值,则更新另一个表。

--CREATE TRIGGER ON ITX
CREATE OR REPLACE TRIGGER TRG_I_LAST_RECEIVED
  AFTER INSERT ON ITEM_TRANSACTION_LOG
    FOR EACH ROW
      WHEN (
        NEW.ITEM_CONDITION_ID =  5005                                               -- REPAIRED
        AND NEW.WORKCENTER_ID IN (5001,5006,5063,5000,5022,5062)   -- EWRC
        AND NEW.ORDER_ITEM_OPER_ID = 5009                                      -- Perform Exit Routing
      )
BEGIN
  UPDATE PART 
  SET LAST_REPAIRED = SYSDATE
  WHERE PART_NO = :NEW.ITEM_PART_NO
END;

当我这样做时,它会添加它,但我得到了这个 (ORA-24344):

现在,我对 SQL (T-SQL) 的理解相当好,但也许我遗漏了一些东西 - 有人能看一下这个并告诉我为什么它无效吗?

编辑: 该问题在更新语句的末尾缺少分号。 Oracle 的分号差异有时让我发疯。

这是正确的陈述,感谢 Justin Cave 找到它:

--CREATE TRIGGER ON ITX
CREATE OR REPLACE TRIGGER TRG_I_LAST_RECEIVED
  AFTER INSERT ON ITEM_TRANSACTION_LOG
    FOR EACH ROW
      WHEN (
        NEW.ITEM_CONDITION_ID =  5005                                               -- REPAIRED
        AND NEW.WORKCENTER_ID IN (5001,5006,5063,5000,5022,5062)   -- EWRC
        AND NEW.ORDER_ITEM_OPER_ID = 5009                                      -- Perform Exit Routing
      )
BEGIN
  UPDATE PART 
  SET LAST_REPAIRED = SYSDATE
  WHERE PART_NO = :NEW.ITEM_PART_NO;    --add that semicolon!
END;

【问题讨论】:

  • show error(假设您使用的是 SQL*Plus)向您表明实际的编译错误是什么?没有什么能在我身上跳出来。
  • 不幸的是,我现在正在回家的火车上。我回家后可以看看它,并且可以 VPN 进入。
  • 第二遍时,您在 update 语句的末尾缺少分号。可能还有其他编译错误。
  • 谢谢。我回家后会试试的。如果您将其作为答案提交,这就是问题所在,我会将您的答案标记为正确答案
  • 如果这就是show errors 显示的错误,我会将其作为答案发布。我不喜欢在没有看到实际错误的情况下将其发布为答案,因为编译器完全有可能发现我没有发现的错误。

标签: sql oracle11g triggers


【解决方案1】:

您的update 语句末尾缺少分号。由于听起来您来自 T-SQL 背景,因此在 SQL Server 中,分号通常是可选的。在 Oracle 中总是需要它们

BEGIN
  UPDATE PART 
  SET LAST_REPAIRED = SYSDATE
  WHERE PART_NO = :NEW.ITEM_PART_NO;
END;

【讨论】:

    【解决方案2】:

    您很可能错过了“NEW.ITEM_CONDITION_ID”和其他列之前的“:”,当然正如“贾斯汀洞穴”提到的那样,您需要“;”更新后声明。

    【讨论】:

      【解决方案3】:

      我不确定,但您似乎必须指定参考 :NEW
      它应该看起来像:

       CREATE OR REPLACE TRIGGER TRG_I_LAST_RECEIVED
            AFTER INSERT ON ITEM_TRANSACTION_LOG
              REFERENCING OLD AS OLD NEW AS NEW
              FOR EACH ROW...
      

      在当前情况下,由于当前触发器类型,对OLD 的引用将为空记录。如果它是一个AFTER UPDATE 触发器,那么对OLD 的引用将是更新操作之前表记录的值。

      【讨论】:

        猜你喜欢
        • 2013-12-24
        • 2018-02-07
        • 2011-01-06
        • 2021-04-05
        • 1970-01-01
        • 2012-08-23
        • 1970-01-01
        • 1970-01-01
        • 2014-10-28
        相关资源
        最近更新 更多