【问题标题】:How can I get "ORA-00904: : invalid identifier" from a valid package?如何从有效包中获取“ORA-00904: : invalid identifier”?
【发布时间】:2011-06-10 23:01:54
【问题描述】:

我有一个有效的过程,其中包含一个 insert..select 语句。现在有一种情况,执行此过程会从该语句中产生“ORA-00904: : invalid identifier”错误。这在理论上怎么可能?没有触发器或动态 SQL。

此外,sqlerrm 中的 ORA-00904 文本没有指向 Oracle 认为无效的任何特定标识符的指针。

Oracle 版本 9.2.0.8

编辑2:

原来从该选择中调用的函数存在问题(将其替换为常量并且一切正常)。可能这就是 ORA-00904 没有给出标识符的原因。尽管如此,问题仍然存在 - 没有动态 sql 的预编译代码怎么会出现这个错误?

【问题讨论】:

  • 你能发布一些示例代码吗!
  • 有意见吗?从你所说的我猜你有一个打印SQLERRM的所有错误(when others)的异常处理程序;如果您没有,无论如何都会引发异常,并会提供有关它来自何处的更多信息。
  • 您确定的函数,以及依次调用的任何函数,也没有动态 SQL?链中是否有 authid current_user 子句,这可能会影响编译和运行时之间的行为(特权和分辨率)?您是否依赖任何不适用于包的角色授予的权限?
  • “现在有一种情况……”是不是意味着它并不总是产生这个错误?
  • @Rene 它仅在一种特定情况下产生该错误。我们解决了这个问题(没有代码更改,没有数据更改),我们再也没有看到这个问题。

标签: oracle oracle9i ora-00904


【解决方案1】:

既然您已经找到了解决方案,这不是您的问题。但我想补充一点,如果包函数有主体,但规格表中没有函数签名,则会出现此错误。

【讨论】:

    【解决方案2】:

    我认为当你访问一个包有效但body需要编译并抛出异常的包时可能会发生这种错误。

    另一个原因可能是带有 authid current_user 的代码以当前用户的权限运行(与拥有用户的权限不同)。这样的过程在一个用户调用时可能会失败,而在另一个用户执行时会成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多