SQL On删除触发器

时间:2016-05-06 16:54:28

标签: sql oracle database-trigger

我正在尝试创建一个触发器,当从表中删除一行时,它会插入到另一个表中:

  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;

我想抓住acctNumagephoneacctNum来自Order表,但agephone来自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

2 个答案:

答案 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