【问题标题】:How can I create a trigger in SQL Commands?如何在 SQL 命令中创建触发器?
【发布时间】:2020-05-12 12:26:14
【问题描述】:

我用这个 PL/SQL 代码在 Oracle APEX 中创建了一个流程:

UPDATE RACUN SET 
  UKUPNO_RACUN = (SELECT SUM(S.IZNOS_STAVKE) 
                  FROM STAVKA_RACUNA S 
                  WHERE S.BROJ_RACUNA_STAVKE = BROJ_RACUNA);

但是如何在 SQL 命令中为该代码创建触发器?

【问题讨论】:

    标签: oracle triggers oracle-apex


    【解决方案1】:

    呃,不——你真的不想那样做。不要存储计算的值。表

    • RACUN 应包含有关该账单的“一般”信息(客户 ID 和姓名、购买日期等),而
    • STAVKA_RACUNA 包含其详细信息(购买了什么、“某物”的数量、价格等)

    当您想要创建发票、报告或其他任何内容时,您可以通过连接这两个表从数据库中选择它:

    select r.broj_racuna, r.datum_racuna, r.ime_kupca, sum(s.iznos_stavke) suma_iznosa
    from racun r join stavka_racuna s on s.broj_racuna_stavke = r.broj_racuna
    

    为什么不(数据库)触发?因为您想要在STAVKA_RACUNA 表上触发after update。但是,由于它刚刚被更改,因此您无法从中进行选择,因为它是mutating。此外,仅仅更新 RACUN 表是没有意义的;您何时将行插入其中?触发器可以触发after insert or update,没问题;它可以使用insertupdatemerge 语句,但会因相同的mutating table 错误而失败。

    此外,您将如何处理删除? Stavka 可以逆转(stornirana),所以你也必须处理它。

    根据您使用的数据库版本(Oracle,对吗?),可以使用数据库包(10g 及更低版本)或复合触发器“修复”变异表。然而,再一次,这不是你应该做的。

    【讨论】:

    • 我想这样做是因为 Oracle APEX 中的进程不会自动执行
    • 好吧,你可以自己运行它们。例如,将其设置为在按下某个按钮时运行(例如“保存”或“提交”)。发布该进程属性;也许你错过了什么。
    • 当我第二次按下保存按钮时执行。这就是问题所在。
    • 在调试模式下运行页面,然后检查发生了什么。
    • 我的流程:来源是PL/sql代码,执行:序列:40,点:处理,运行流程:每页访问一次...我试图改变这一点,但流程执行在一样的方法。提交报告后,我必须再次提交
    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 2015-06-27
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多