大家好,在尝试创建触发器时收到此错误消息,这让我有点困惑。 这是我的触发代码。
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 秒”
有人猜出为什么吗?
感谢您的帮助
最佳答案
显示的错误只是最高级别。根据您运行它的位置,您应该能够看到堆栈跟踪。客户将具体决定如何做到这一点;无论如何,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
)。
似乎您从上一个问题的两个答案中复制了代码,但没有真正理解他们在做什么。您可能想查看trigger design guidelines (特别是关于不重复数据库功能的一项)和 syntax for create trigger
其中引入了引用
子句。
关于database - PL/SQL : SQL Statement ignored?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16509335/