问题
无论我做什么,我都无法让我的触发器工作。似乎总是抱怨 SQL 命令没有正确结束,忽略 SQL 语句等等。
研究
我花了几个小时研究为什么会出现这个问题,但我仍然空手而归。这是我第一次创建触发器,所以我觉得它与放置东西有关。
我试过的
我已经尝试了很多很多东西。我尝试在括号中的最后一个变量中添加逗号,我尝试添加 ; 随机陈述等等。这是我的触发器:
CREATE OR REPLACE TRIGGER create_base_invoice
AFTER INSERT ON reservation
BEGIN
INSERT INTO
invoice
VALUES
(i.resnum, i.bnum, i.rnum, c.cfname, c.clname, i.bstartdate, null, null)
SELECT
i.resnum, i.bnum, i.rnum, c.cfname, c.clname, i.bstartdate
FROM
INSERTED i, CUSTOMER c
WHERE(
(i.cfname = c.cfname)
AND
(i.clname = c.clname)
);
END create_base_invoice;
在我的情况下,我不明白 SELECT 命令的意义,我尝试将其删除,但我没有收到不同的错误,所以我不确定我是否需要它。
我添加它的原因是偶然发现了一篇与我的场景非常相似的帖子,并看到答案包含我当时失踪的 SELECT 语句。
我需要 where 子句的原因是因为 Reservation 表实际上并不包含客户姓名和姓氏(在这种情况下我们需要)。它只保存客户编号。这是预订表:
RESNUM
CNUM
BNUM
RNUM
BSTARTDATE
BDURATION
BOCCUPANTS
BSTATUS
BPAYMENT
我删除了该VALUES
子句,现在错误是
3/78 PL/SQL:ORA-01747:无效的 user.table.column、table.column 或列规范
我也删,null ,null
了。然后它抱怨
缺少 VALUES 关键字
所以,我想做的是根据预订创建发票。当有人预订预订时,触发器会保存预订中的某些变量(resnum、bnum、rnum、bstartdate、cnum),然后根据客户编号(cnum)查找客户全名。
所有这些都保存到发票中以制作基本发票。然后我有另一个程序,添加结帐日期并计算总住宿价格。我们不会将 cnum 保存到发票中。
澄清一下,cnum 本质上只是用于搜索客户并找到他们的名字和姓氏,然后将其保存到发票上。
(编辑以下评论并检查 SQL Server 中的 INSERTED 内容后)
SQL Server 中的
INSERTED
表表示由触发语句插入的行。甲骨文没有这个。相反,行级触发器可以引用受触发器影响的每一行的列值,使用:new
和:old
值。(只:new
为插入填充值,并且只:old
为删除填充。)因此我认为你需要的是这样的:这将为每个新预订创建一张发票,包括从客户表中查找的详细信息。
有两种口味
insert
:和
一种用于插入固定值,另一种用于从查询中加载结果。