2

大家好,在尝试创建触发器时收到此错误消息,这让我有点难过。这是我的触发代码。

CREATE OR REPLACE TRIGGER CUSTOMER_AD
  AFTER DELETE ON CUSTOMER
  REFERENCING OLD AS OLD
  FOR EACH ROW
DECLARE
  nPlaced_order_count  NUMBER;
BEGIN
  SELECT COUNT(*)
    INTO nPlaced_order_count
    FROM PLACED_ORDERS p
    WHERE p.FK1_CUSTOMER_ID = OLD.CUSTOMER_ID;
IF nPlaced_order_count > 0 THEN
INSERT into previous_customer
(customer_id,
first_name,
last_name,
address,
AUDIT_USER,
AUDIT_DATE)
VALUES
(:old.customer_id,
:old.first_name,
:old.last_name,
:old.address,
UPPER(v('APP_USER')),
SYSDATE);
END IF;
END CUSTOMER_AD;

我得到的错误是“第 4 行错误:PL/SQL:SQL 语句被忽略 0.10 秒”

任何人都猜到为什么?

谢谢您的帮助

4

1 回答 1

4

显示的错误只是最高级别。根据您运行它的位置,您应该能够看到堆栈跟踪。客户将确切地确定如何做到这一点;无论如何,SQL*Plus 或 SQL Developer 会向您展示更多内容,但我并不真正了解其他客户端。如果您在客户端中看不到详细信息,则可以通过以下方式查询它们:

select * from user_errors where name = 'CUSTOMER_AD' and type = 'TRIGGER'

假设表都存在,它可能是这一行:

WHERE p.FK1_CUSTOMER_ID = OLD.CUSTOMER_ID;

应该是:

WHERE p.FK1_CUSTOMER_ID = :OLD.CUSTOMER_ID;

当引用表中的旧(或新)值时,referencing子句中指定的名称前面有一个冒号,因此:OLD在这种情况下。正如您已经在insert ... values()条款中所做的那样。

(从评论来看,我的假设被证明是错误的 - 以及缺少冒号的问题,表名确实是placed_order,没有s)。

似乎您从上一个问题的两个答案中复制了代码,而没有真正了解他们在做什么。您可能想查看触发器设计指南(尤其是关于不重复数据库功能的指南)以及引入该子句的语法。create triggerreferencing

于 2013-05-12T16:26:25.007 回答