【问题标题】:Oracle: Trigger not workingOracle:触发器不起作用
【发布时间】:2015-10-20 10:01:10
【问题描述】:

我有这个触发器:

CREATE OR REPLACE TRIGGER trig_update_process_info
  AFTER INSERT ON rocessstep FOR EACH ROW
DECLARE
  audit_time TIMESTAMP(6);
  found_flag NUMBER DEFAULT 0;
BEGIN

  SELECT MAX(lastupdatetime) INTO audit_time
    FROM processinfo
   WHERE instance = :new.instance;

EXCEPTION
  WHEN no_data_found THEN
    found_flag := NULL;

    IF found_flag IS NULL
    THEN
      INSERT INTO processinfo
       VALUES (:new.instance, :new.step, :new.status, :new.iteration, :new.audittime);
    ELSE
      IF :new.audittime > audit_time
      THEN
        UPDATE processinfo
        SET step = :new.step, lastupdatetime = :new.audittime, status = :new.status, iteration = :new.iteration
        WHERE instance = :new.instance;
      END IF;
    END IF;
END;

但它不起作用。你能告诉我这个触发器有什么问题吗?

这里是目标表:

创建表进程信息( 实例字符(36 字节)不为空, STEP VARCHAR2(128 字节)不为空, 状态编号(*,0)不为空, 迭代次数(*,0)不为空, LASTUPDATETIME TIMESTAMP(6) 非空 );

谢谢

【问题讨论】:

  • 什么不起作用?请提供人们需要知道的一切,以便他们为您提供帮助。
  • 它不工作”既不是有效的 Oracle 消息,也不是可接受的问题描述

标签: sql oracle plsql database-trigger


【解决方案1】:

由于聚合,您的查询永远不会抛出 no_data_found。相反,如果没有匹配的数据,则 audit_time 将为空,因此您可以对其进行测试 - 根本不需要 found_flag。正如所写,整个 if/else 部分都在异常处理程序内,因此永远无法对其进行评估(假设您希望在没有引发异常的情况下点击 else 部分,但您没有单独的开始/结束围绕查询,因此您没有正确构建块)。

...
BEGIN
  SELECT MAX(LASTUPDATETIME) INTO AUDIT_TIME FROM PROCESSINFO
  WHERE INSTANCE = :NEW.INSTANCE;

  IF AUDIT_TIME IS NULL 
  THEN
    INSERT INTO PROCESSINFO (INSTANCE, STEP, STATUS, ITERATION, LASTUPDATETIME)
      VALUES (:NEW.INSTANCE, :NEW.STEP, :NEW.STATUS, :NEW.ITERATION, :NEW.AUDITTIME);
  ELIF :NEW.AUDITTIME > AUDIT_TIME THEN 
    UPDATE PROCESSINFO SET STEP = :NEW.STEP, LASTUPDATETIME = :NEW.AUDITTIME,
      STATUS = :NEW.STATUS, ITERATION = :NEW.ITERATION
    WHERE INSTANCE = :NEW.INSTANCE;
  END IF;
END;

看起来对于每个instance,在processinfo 中只需要一行,因此您也可以考虑使用合并语句,而不是选择是更新还是插入。

ON ROCESSSTEP 看起来也很奇怪,但如果该表名错误,则根本不会创建触发器,而不仅仅是“不工作”。

【讨论】:

    猜你喜欢
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2023-03-15
    相关资源
    最近更新 更多