【问题标题】:Unknown "SP2-0552: Bind variable "NEW" not declared" message on trigger触发器上的未知“SP2-0552:未声明绑定变量“NEW””消息
【发布时间】:2016-11-29 06:21:54
【问题描述】:

我的一个脚本中有这个触发器:

    CREATE OR REPLACE TRIGGER MS_DB.DB_TR_IncrementTrialNumber BEFORE INSERT 
ON MS_DB.DB_SUMMARY FOR EACH ROW

begin
    UPDATE MS_DB.DB_Summary SET MS_DB.DB_Summary.TimesGenerated =
        (Select COALESCE(MAX(TimesGenerated),0)+1 
         From MS_DB.DB_Summary
         Where MS_DB.DB_Summary.StepID = :NEW.StepID And 
         MS_DB.DB_Summary.ValidationID = :NEW.ValidationID AND  
         MS_DB.DB_Summary.SummaryDate = :NEW.SummaryDate);
    where MS_DB.DB_Summary.ID = :NEW.ID;
end;
/

我使用 TOAD 来执行脚本。 当我使用“作为脚本执行”按钮时,它工作正常。 但是当我在 SQLPlus 窗口中运行它时,我得到了这一行:

SP2-0552: Bind variable "NEW" not declared

任何想法为什么我得到这个? 谢谢

【问题讨论】:

  • :NEW 是一个占位符。你只想要NEW(没有:),它指的是新行——这正是错误告诉你“绑定变量NEW未声明”的内容。
  • 它是否在模拟默认的 SQL*Plus 空白行行为,也许?换句话说,它是否将块与create 分开 - 如果您删除begin 之前的空白行,它是否有效?
  • 这是您的回答 Alex Poole。它是固定的。谢谢
  • 什么是“SQLPlus 窗口”?这是 TOAD 的事情还是您的意思是实际的 Oracle SQLPlus?我可以在 SQLPlus 中创建带有空行的触发器,而无需 set sqlblanklines

标签: oracle plsql triggers toad


【解决方案1】:

默认情况下,SQL*Plus 将空行视为语句的结尾。第一行,create,永远不会执行。其余部分作为匿名块执行,由于它不再是触发器语句的一部分,因此无法识别 NEW

您可以删除begin 之前的空白行,或者在开始之前执行set sqlblanklines on

【讨论】:

  • 其实还有一个错误。 where 前面的分号需要去掉。
  • 是的,没有看触发器实际在做什么,但你是对的。你不会按照你编码的方式得到一个变异表错误吗?您正在查询和更新(!)触发器所针对的同一个表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2021-12-11
相关资源
最近更新 更多