【问题标题】:I'm trying to update 2 fields in multiple tables in my database using a trigger after inserting a new row我正在尝试在插入新行后使用触发器更新数据库中多个表中的 2 个字段
【发布时间】:2019-01-14 22:55:29
【问题描述】:

我刚刚创建了触发器

代码如下:

CREATE OR REPLACE TRIGGER tr_update_solde_nbreserv
AFTER INSERT ON reservation
FOR EACH ROW
BEGIN
    UPDATE CLIENTS
    SET CLIENTS.NB_RESERV = NB_RESERV+1 , CLIENTS.SOLDE = SOLDE+1
    FROM dbo.clients as c
    INNER JOIN dbo.reservation as r
    ON c.numc = r.numc
    WHERE r.numr = :new.numr;
          
    BEGIN
        SELECT fillHist_station FROM DUAL;
    END;
    
end tr_update_solde_nbreserv;

我遇到了这两个错误:

错误(1,9):PL/SQL:SQL 语句被忽略

错误(3,9):PL/SQL:ORA-00933:SQL 命令未正确结束

我该如何解决它们

【问题讨论】:

  • 不是第一个错误,但是您有dbo 架构吗?此外,update 的语法是 here。我不确定INNER JOIN 的位置。

标签: oracle plsql


【解决方案1】:

您的触发代码存在几个问题。

1) 这部分代码的用途不清楚:

BEGIN
    SELECT fillHist_station FROM DUAL;
END;

fillHist_station 未声明,因此此代码会引发invalid identifier 错误。

2) UPDATE 查询的语法无效。此外,您打算从触发器触发的表中进行选择,这在 Oracle 中是不允许的。通过查看您的代码,您似乎实际上不需要查询RESERVATION 来实现您的目标。由于刚刚在RESERVATION 中插入了一行,因此您已经知道对应的客户编号。

3) 你最后错过了/

这是您的代码的更新版本,您可以在this db fiddle 中使用(您没有提供表的结构,所以我只是创建了查询中引用的列):

CREATE OR REPLACE TRIGGER tr_update_solde_nbreserv
AFTER INSERT ON RESERVATION
FOR EACH ROW
BEGIN 
    UPDATE CLIENTS
    SET NB_RESERV = NB_RESERV+1 , SOLDE = SOLDE+1
    WHERE numc = :new.numc; 
END tr_update_solde_nbreserv;
/

【讨论】:

  • 我只需要更新在此处进行预订的客户的字段是我的 2 个表:CLIENTS(numc(primarykey), name,address, tel, Solde, nb_reserve(nbre of预订)) 预订(numr(主键),numc,id_chambre,dater,datedeb,datefin)
  • @daniel :好吧,这就是这个触发器应该做的。你能测试一下(或者看看 db fiddle),让我知道它是否适合你?
  • 欢迎@daniel!
【解决方案2】:
update CLIENTS
    SET CLIENTS.NB_RESERV = NB_RESERV+1 , CLIENTS.SOLDE = SOLDE+1
    FROM dbo.clients as c
    inner join dbo.reservation as r
        on c.numc = r.numc
        where r.numr = :new.numr;

Oracle 数据库不支持以这种方式使用内部连接进行更新。此外,dbo.clientsdbo.reservations 看起来像 Sql Server 表,而不是 oracle。

我相信您正在寻找类似的东西,但我不确定这些关系。您可能需要修复查询。

UPDATE 
(
   SELECT clients.nb_reserv, r.nb_reserv as r_nb_reserv, clients.solde, r.solde as r_solde 
   FROM clients
   inner join reservation as r
     on c.numc = r.numc
   where r.numr = :new.numr
) t
SET CLIENTS.NB_RESERV = r_nb_reserv + 1, clients.solde = r_solde+1;

更简单的方法

UPDATE clients SET NB_RESERV = (SELECT nb_reserv +1
                                  FROM reservations 
                                  WHERE c.numc = r.numc and r.numr = :new.numr),
    SOLDE = (SELECT SOLDE +1
                                  FROM reservations 
                                  WHERE c.numc = r.numc and r.numr = :new.numr)
WHERE  EXISTS (SELECT 1 FROM reservations 
     WHERE c.numc = r.numc and r.numr = :new.numr);

【讨论】:

  • 我在处理它,但我不确定你的关系,所以你可能需要处理它
  • 我唯一的问题是我需要更新的字段在客户表中,当在预订表中插入一行时我需要更新它们是带有字段的表:CLIENTS(numc (primarykey), name,address, tel, Solde, nb_reserve(nbre of reservations) ) RESERVATION(numr(primary key), numc, id_chambre, dater, datedeb, datefin)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 2021-07-27
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多