SQL 删除触发器

SQL On Delete Trigger

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

  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 来自订单 table,但 agephone 来自客户 table。因此,我加入了两个 tables(在 acctid 键上)。因此合并后的结果将如下所示:

acctNum Age Phone

我在尝试编译触发器时遇到此错误:

2/2  PL/SQL: SQL Statement ignored
3/2  PL/SQL: ORA-00933: SQL command not properly ended

有人知道这个问题吗?

编辑: Table结构:

订单Table:AcctNum MenuNum startOrder endOrder
客户 Table:AcctNum age phone

您的插入语句不正确。您需要在表中指定要 select 的列。

select 子句添加到您的插入语句中。此外,删除 values 关键字并指定列名:

  Insert Into CancelledOrders (acctNum, age, phone)
  Select :old.acctNum, age, phone
  From OrderTable Natural Join Customer
  Where acctid = :old.acctNum AND menuid = :old.menuNum;

您正在混合用于不同事物的 values and select (subquery) syntax。您可以从使用来自 :old 伪记录的值和来自客户 table:

的值的查询中插入
    Insert Into CancelledOrders -- (acctNum, age, phone)
    Select :old.acctNum, age, phone
    From Customer
    Where acctNum = :old.acctNum;

最好将目标 table 中的列指定为插入子句的一部分(我已将其注释掉以防名称不同)。您也不希望(或不需要)重新查询触发器所针对的 table;您已经拥有所需的数据,并且在某些情况下会出现 mutating-table 错误。所以不需要加入。