我正在尝试创建一个触发器,当从表中删除一行时,它会插入到另一个表中:
1 Create Or Replace Trigger cancel
2 After Delete
3 On OrderTable
4 For EACH ROW
5 Begin
6 Insert Into CancelledOrders Values (:old.acctNum, age, phone)
7 From OrderTable Natural Join Customer
8 Where acctid = :old.acctNum AND menuid = :old.menuNum;
9 End;
10 /
11 Show Errors;
我想抓住acctNum
,age
和phone
。 acctNum
来自Order表,但age
和phone
来自Customer表。因此,我加入了两个表(在acctid
键上)。因此,连接结果将如下所示:
acctNum Age Phone
当我尝试编译Trigger时出现此错误:
2/2 PL/SQL: SQL Statement ignored
3/2 PL/SQL: ORA-00933: SQL command not properly ended
有谁知道这个问题?
修改 表结构:
OrderTable:AcctNum MenuNum startOrder endOrder
客户表:AcctNum age phone
答案 0 :(得分:3)
你正在混合values
and select
(subquery) syntax,这是针对不同的事情。您可以从使用 Insert Into CancelledOrders -- (acctNum, age, phone)
Select :old.acctNum, age, phone
From Customer
Where acctNum = :old.acctNum;
伪记录中的值和来自customer表的值的查询中插入:
{{1}}
最好将目标表中的列指定为insert子句的一部分(如果名称不同,我会将其注释掉)。您也不希望(或需要)重新查询触发器所针对的表;你已经拥有了所需的数据,在某些情况下会出现变异表错误。所以不需要加入。
答案 1 :(得分:1)
您的插入语句不正确。您需要在表格中指定要选择的列。
将values
子句添加到insert语句中。另外,删除了 Insert Into CancelledOrders (acctNum, age, phone)
Select :old.acctNum, age, phone
From OrderTable Natural Join Customer
Where acctid = :old.acctNum AND menuid = :old.menuNum;
关键字并指定了列名:
:old