插入新行后,我尝试使用触发器更新数据库中多个表中的2个字段

时间:2019-01-14 22:55:29

标签: oracle plsql

我刚刚创建了触发器

代码如下:

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命令未正确结束

我该如何解决

2 个答案:

答案 0 :(得分:2)

您的触发代码有几个问题。

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;
/

答案 1 :(得分:1)

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数据库中不支持带有内部联接的

update。而且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);