创建将更新属性的触发器

Posted

技术标签:

【中文标题】创建将更新属性的触发器【英文标题】:Creating a trigger that will update an attribute 【发布时间】:2021-04-04 00:33:47 【问题描述】:

问题:编写一个触发器,该触发器将在每次更新行表(插入、更新或删除新行)时更新发票小计。包括用于测试插入、更新和删除的 SQL 语句。

我发现很难正确理解触发器,我不知道为什么。我了解它的基本概念(至少我认为我了解),但我似乎无法理解如何回答我的问题。以下代码是我尝试回答上述问题:

create or replace trigger update_subtotal
after insert or update or delete 
on invoice
for each row

begin

insert into line ('inv_number', 'line_number', 'p_code', 'line_units', 'line_price')
values ('1009', '3', '12345-6t', '1', '123.45');

end;

select * from line;

运行此代码后,我遇到了以下错误:

Errors: TRIGGER UPDATE_SUBTOTAL
Line/Col: 3/1 PL/SQL: SQL Statement ignored
Line/Col: 3/19 PL/SQL: ORA-00928: missing SELECT keyword
Line/Col: 17/1 PLS-00103: Encountered the symbol "SELECT"

我正在使用 Oracle Live。

简而言之:帮助。

【问题讨论】:

听起来好像有两张表,一张用于发票,一张用于行项目。您还没有向我们展示这些表格的实际外观。帮助我们帮助您完成一个测试用例——向我们展示如何创建表格以及您拥有哪些数据。如果您使用的是 Oracle LiveSQL,请将您正在处理的内容的链接发送给我们,以便我们自己查看。 [livesql.oracle.com/apex/… @JustinCave 这是脚本文件的链接。 【参考方案1】:

您的概念似乎倒退了。 invoice 表需要在line 更改时更新——因此line 需要触发器并且对invoice 的更改是update。应该是这样的:

create or replace trigger trg_line_update_subtotal
after insert or update or delete 
on line
for each row
begin
    update invoice i
        set total = coalesce(i.total, 0) +
                    coalesce(:new.line_Units * :new.line_price, 0) -
                    coalesce(:old.line_Units * :old.line_price, 0)
        where i.inv_number = coalesce(:new.inv_number, :old.inv_number);
end;

【讨论】:

感谢您的澄清。当我运行此代码时,我最终遇到此错误:错误:TRIGGER TRG_LINE_UPDATE_SUBTOTAL Line/Col:4/9 PLS-00103:在预期以下情况之一时遇到符号“WHERE”:(begin case declare end exception exit for goto if loop mod null pragma raise return select update while with @yshaikh20x:分号太多,缺少一些零。请重试。 感谢您的帮助!现在可以了。我只需要做我的测试就可以了!

以上是关于创建将更新属性的触发器的主要内容,如果未能解决你的问题,请参考以下文章

如何创建 CloudKit 订阅通知以触发记录属性更新?

SQL - 触发更新错误

纠正我在 mysql 触发器中的语法错误

创建触发器:通过将数据插入另一个表行来更新表列

创建一个触发器,在更新行时将旧值插入其他表

事件属性更改不会触发