PL/SQL:忽略 SQL 语句?

Posted

技术标签:

【中文标题】PL/SQL:忽略 SQL 语句?【英文标题】:PL/SQL: SQL Statement ignored? 【发布时间】:2013-05-12 16:10:10 【问题描述】:

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

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 秒”

有人猜到为什么了吗?

感谢您的帮助

【问题讨论】:

Trigger on delete where customers have had an order 的可能重复项 类似但完全不同的问题 【参考方案1】:

显示的错误只是***别。根据您运行它的位置,您应该能够看到堆栈跟踪。客户将确切地确定如何做到这一点;无论如何,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() 子句中所做的那样。

(来自 cmets,我的假设结果是错误的 - 以及缺少冒号的问题,表名实际上是 placed_order,没有 s)。

似乎您从上一个问题的两个答案中复制了代码,而没有真正了解他们在做什么。您可能想查看trigger design guidelines(特别是关于不复制数据库功能的那个)和引入referencing 子句的syntax for create trigger

【讨论】:

我了解我当前正在运行的代码。我只是被这个错误难住了。我已经更改了您的建议,但仍然出现相同的错误,我也检查了所有表和列名 似乎在“nPlaced_order_count NUMBER;”附近行会说它不存在。任何想法为什么? @AlexPoole @RichardClare - 你的桌子叫placed_order(正如你在上一个问题中所说)还是placed_orders(正如你在这个问题中所说的)? @Alex 在我看来,“SQL statement Ignored”和select * from user_errors之间的联系是这里最重要的一点。可能想强调/修饰一些。 谢谢@jpaugh,我已将其添加到答案中。它也很有用,例如“程序编译时出现错误”消息。

以上是关于PL/SQL:忽略 SQL 语句?的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 语句被忽略

ORACLE:错误错误(6,3):PL/SQL:SQL 语句被忽略和错误(8,3):PL/SQL:ORA-00933:SQL 命令未在过程中正确结束

PL/SQL: SQL 语句被忽略 - 创建一个过程得到编译错误

自定义 SQL 函数 - PL/SQL:语句被忽略

ORA-06550:第 12 行,第 9 列:PL/SQL:ORA-00936:缺少表达式 ORA-06550:第 9 行,第 5 列:PL/SQL:忽略 SQL 语句

PL/SQL 语句被忽略且值不足