在Oracle上创建触发器

时间:2016-02-18 21:02:13

标签: sql oracle11g triggers

这是在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;    --add that semicolon!
END;

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

oracle error screen

现在,我对SQL的理解相当不错(T-SQL),也许我错过了一些东西 - 有人可以注意这一点并告诉我为什么它无效吗?

修改: 更新声明结束时,问题是缺少分号。甲骨文的分号差异有时会让我感到疯狂。

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

...

  var t = 0;

  function next() {
    if (t) return;
    imgCount++;
    if (imgCount > totalImgs) imgCount = 0
    document.getElementById("slideshow").src = imageGallery[imgCount];
  }

  function previous() {
    if (t) return;
    imgCount--;
    if (imgCount < 0) imgCount = totalImgs;
    document.getElementById("slideshow").src = imageGallery[imgCount];
  }

...

document.getElementById("slideshow").onload = function(){
  var obj = this;
  var nextSibling = obj.nextSibling;
  while(nextSibling && nextSibling.nodeType != 1) {
      nextSibling = nextSibling.nextSibling
  }
  nextSibling.className = 'fade';
  t = setTimeout(function(){
    nextSibling.className = '';
    nextSibling.src = obj.src;
    t = 0;
  }, 1000);
}

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我不确定,但似乎你必须指定重新加入: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的引用将是更新操作之前的表记录的值。

答案 2 :(得分:0)

很可能你错过了&#34;:&#34;之前&#34; NEW.ITEM_CONDITION_ID&#34;和其他人一样,当然还有#34; Justin Cave&#34;提到你需要&#34;;&#34;在更新声明之后。