【问题标题】:Can't select from dba_tab_cols from within stored procedure (PL/SQL)无法从存储过程 (PL/SQL) 中的 dba_tab_cols 中进行选择
【发布时间】:2010-10-22 15:54:20
【问题描述】:

我正在尝试从存储过程中的 dba_tab_cols 视图中进行选择。它不起作用,我不知道为什么。

如果我执行以下 SQL 作为查询:

SELECT t.data_type FROM dba_tab_cols t
WHERE 
    t.table_name = 'ACCOUNTTYPE' AND 
    t.column_name = 'ACCESSEDBY';

它工作正常。但是,如果我将它复制到这样的存储过程中:

SELECT t.data_type INTO dataType FROM dba_tab_cols t
WHERE
    t.table_name = 'ACCOUNTTYPE' AND 
    t.column_name = 'ACCESSEDBY';

我收到错误消息“PL/SQL:ORA-00942:表或视图不存在”,并且编辑器在尝试编译时突出显示 dba_tab_cols。在这两种情况下都使用相同的数据库用户。

dataType 声明为: 数据类型 varchar2(128);

PL/SQL (Oracle 9)

有人知道这个问题吗?

【问题讨论】:

    标签: sql oracle stored-procedures oracle9i ora-00942


    【解决方案1】:

    我没有安装 oracle,但也许 dataType 是保留字。我会尝试其他的。

    【讨论】:

      【解决方案2】:

      这很可能是特权问题。是通过角色访问dba_tab_columns 的权限还是直接选择授予您的用户?通过角色授予的权限在 SPROCS 中不可用。

      快速浏览一下谷歌建议使用all_tab_cols 并查看该表是否包含您需要的所需信息。

      【讨论】:

      • 谢谢,这似乎有效!我无法通过 Google 找到答案 :)
      【解决方案3】:

      添加到 Eoin 的答案:

      对于大多数人来说,它是 惊讶于用户无法选择 过程中的表 if 他没有被授予选择权 直接正确(而不是通过 角色)

      如果表用户试图编译这个 程序,他得到一个 ORA-00942 虽然这张表肯定存在 他被授予选择权 这张桌子。问题是 程序不尊重角色;只要 直接授予的权利受到尊重。 所以,这意味着表所有者必须 重新授予选择权:

      http://www.adp-gmbh.ch/ora/err/ora_00942.html

      【讨论】:

      • 谢谢,这个链接很有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-31
      • 2014-07-17
      相关资源
      最近更新 更多