【问题标题】:How can I trigger a delete action on a table with an if-statement?如何使用 if 语句触发表上的删除操作?
【发布时间】:2019-12-19 12:20:03
【问题描述】:

我正在为个人项目开发此触发器,但我不确定自己做错了什么。触发器编译得很好,并且测试了触发器应该做什么,它可以工作......但是条件不起作用。触发器什么都不做

这是我的代码

CREATE OR REPLACE TRIGGER z_delete
BEFORE INSERT or UPDATE OR INSERT OF status ON TABLE_1
FOR EACH ROW


BEGIN
IF (:new.condition_1 = 'I' or :new.condition_2 ='Z')
  THEN

  DELETE TABLE_2 WHERE EXISTS
    (SELECT * FROM TABLE_1 WHERE TABLE_1.Value_1 = TABLE_2.Value_2 AND TABLE_1.condition_1='I');


  DELETE interference_results WHERE EXISTS
    (SELECT * FROM TABLE_1 WHERE TABLE_1.Value_1 = TABLE_2.Value_3 AND TABLE_1.condition_1 = 'I');

END IF;

END z_delete;

有人知道发生了什么吗??

提前致谢

【问题讨论】:

  • 我希望在触发器的某处引用 :NEW:OLD
  • 嗨@Luisao,欢迎来到 Stack Overflow。您能否结合以下内容解释一下“并且,测试触发器应该做什么,它可以工作”:“触发器什么也不做”。谢谢!
  • 我很惊讶它可以编译,因为第二个 delete 语句引用了一个不在任何 fromjoin 子句中的 table_2,我很惊讶它没有当它查询触发器所基于的同一个表时,在运行时给出一个“表正在变异”错误。这与您的实际代码有多相似?
  • 我同意@WilliamRobertson。而且,当你问一个问题时,尽量保持活跃,已经有两个答案,很少有 cmets,OP 没有回答或反应......

标签: sql oracle if-statement plsql triggers


【解决方案1】:

你的问题是:“有人知道发生了什么吗??”。所以我会试着回答这个问题。

  1. 在触发器代码的开头,您有一些不需要的代码:

    BEFORE INSERT or UPDATE OR INSERT OF status ON TABLE_1
    

    这就够了:

    BEFORE INSERT or UPDATE OF status ON TABLE_1
    
  2. 然后在您的触发器中,第一个 DELETE 命令是可以的,而第二个不是因为 eexist 子句中的选择不正确:

    CHECK THIS EXAMPLE

  3. 为了进一步帮助您,您需要告诉我您对第二个 DELETE 子句的计划是什么。你想完成什么?是表的“interference_results”名称还是?

希望这对现在有所帮助...

【讨论】:

    【解决方案2】:

    您是否偶然查询了要插入到 TABLE_1 中的同一条记录?如果是这样,“之前”触发器将不会执行,因为尚未创建记录。或者,在相关 DML 中使用实际的 :NEW 值。

    【讨论】:

      猜你喜欢
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 2020-03-18
      • 2013-04-11
      相关资源
      最近更新 更多