我刚刚创建了触发器
代码如下:
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命令未正确结束
我该如何解决
答案 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.clients
和dbo.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);