【问题标题】:Change value of table field when value of another field was changed in oracle在 oracle 中更改另一个字段的值时更改表字段的值
【发布时间】:2014-03-25 11:57:18
【问题描述】:

我在 oracle 数据库中有一个表,它有两个字段:statusnotesstatus 字段只有 3 个实际值:active, not-active, removed

  • statusactive 时,默认情况下notes 字段中没有任何内容。

  • 如果 status 更改为 not-activenotes 将输入值。 由用户

  • 如果将status 改回active,我需要删除notes 字段值。

我以前从未使用过触发器,所以对我来说有点复杂,但这是我所拥有的:

CREATE TRIGGER update_notes
AFTER UPDATE ON table1
FOR EACH ROW
BEGIN
IF status = 'Active' THEN UPDATE table1 SET notes = '';
END IF;
END;

但它失败了。我错过了什么?

【问题讨论】:

    标签: sql oracle plsql triggers


    【解决方案1】:

    不要使用update 语句,只需赋值即可:

    CREATE TRIGGER update_notes
    BEFORE UPDATE ON table1
    FOR EACH ROW
    BEGIN
      IF :new.status = 'Active' THEN 
         :new.notes = null;
      END IF;
    END;
    

    顺便说一句:表格有,而不是“字段”

    【讨论】:

    • 现在我有了完全不同的东西:04084. 00000 - “无法更改此触发器类型的新值” *原因:新触发器变量只能在行插入或更新触发器之前更改。 *操作:更改触发器类型或删除变量引用
    • @user3065540:抱歉,我没有看到您使用的是AFTER 触发器。当然你需要使用BEFORE 触发器(见我的编辑)
    • 谢谢 a_horse_with_no_name!这个:在每行更新 VP_DET 之前创建触发器 update_notes IF :new.VP_STATUS = 'Active' THEN :new.VP_STATUS_NOTES := '';万一;结尾;工作!
    【解决方案2】:

    你可以试试下面吗..

    CREATE TRIGGER update_notes     
    AFTER UPDATE ON table1
    FOR EACH ROW
    BEING
      IF :NEW.status = 'Active' THEN
         :NEW.notes = '';
      END IF;
    END;
    /
    

    【讨论】:

    • Oracle 中没有inserted
    • @a_horse_with_no_name 你说得对,亲爱的。我可以改变我的报价。因此,如果有人查看此博客,那么他们不会感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2018-08-31
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多