【问题标题】:Is it possible to update 2 columns of 2 tables using triggering in oracle?是否可以使用 oracle 中的触发来更新 2 个表的 2 列?
【发布时间】:2014-09-21 07:37:31
【问题描述】:

我创建了 3 个表,其名称是客户、付款和订单。它们具有相同的列名称 customerNumbercustomerNumbercustomers 的主键strong> 表和 paymentsorders 表的外来。现在我想创建一个触发器,其工作是在更新客户表中的 customerNumber 之前更新 payment 和 orders 表中的 customerNumber .

我的代码在这里:

create or replace trigger customers_update 
before update of customerNumber on customers 
for each row
begin
update payments,orders 
set 
payments.customerNumber = :new.customerNumber
orders.customerNumber = :new.customerNumber
where (payments.customerNumber = :old.customerNumber)
and 
(orders.customerNumber = :old.customerNumber);
end;
/

但它显示了一些这样的问题

第 2 行错误:PL/SQL:SQL 语句被忽略

  1. 创建或替换触发器customers_update
  2. 在更新客户的 customerNumber 之前
  3. 每一行
  4. 开始

所以我的问题是如何解决问题?

【问题讨论】:

  • 第 2 行实际上是 update payments,orders。触发器的 PL/SQL 实现块(在本例中)以 begin 开头。

标签: sql oracle plsql


【解决方案1】:

只需使用两个更新语句:

update payments
    set customerNumber = :new.customerNumber
    where payments.customerNumber = :old.customerNumber;

update orders 
    set customerNumber = :new.customerNumber
    where orders.customerNumber = :old.customerNumber;

Oracle 不允许在同一语句中更新两个表。

【讨论】:

  • 我知道它可以工作,但我想知道为什么只用一个更新查询就不可能?
  • @RumyHasan 。 . .因为 Oracle 不支持该功能。 MySQL 有,但 Oracle 没有。
  • 如果您可以避免在触发器中执行此操作,并且可以在更新客户表的同一位置执行此操作,请执行此操作。
  • 也许您应该将其包装在事务中以正确模拟“多表更新”?据我记得这些是原子的(至少在 MySQL 中)
  • @SylvainLeroux 。 . .我对 Oracle 的理解是触发器都在同一个事务中。因此,尽管您希望将它们包装在存储过程中的事务中以获得此类语义,但在触发器中不需要它。
【解决方案2】:

“Oracle 不允许在同一语句中更新两个表。”

确实如此,但如果您真的喜欢,您可以创建一个视图并更新该视图。

使用 INSTEAD OF 类型的触发器,您可以同时更新两者,但内部仍会更新两次,但其中一次更新功能级别。

如果您有任何问题,请告诉我。

谢谢。

【讨论】:

    猜你喜欢
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2020-08-10
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多