database - PL/SQL : SQL Statement ignored?

标签 database oracle plsql triggers

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

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/

相关文章:

oracle - 如何在 SQLPlus 或 PL/SQL 中创建菜单

sql - plsql - 获取第一行 - 哪个更好?

regex - PL/SQL 正则表达式匹配不在引号内的逗号

mysql - MySQL查询有问题

sql - 为客户生成 SQL 升级脚本

sql-server - 如何将Oracle包转换为SQL Server?

xml - 具有多个子节点的 Oracle XML 查询

oracle - 关于Oracle序列的问题

sql-server - 在 1 台服务器上的 2 个不同数据库中的表之间使用 INNER JOIN 更新查询

mysql - SQL 查询 : list of all maximal reservers