【问题标题】:Call of dba table on stored procedure在存储过程中调用 dba 表
【发布时间】:2013-10-13 04:31:33
【问题描述】:

我是Oracle 数据库11g R2 的新手,这是为了获取数据库表空间的信息。我像.sql 一样运行下一个代码:

select  TABLESPACE_NAME,
INITIAL_EXTENT,
NEXT_EXTENT,
MIN_EXTENTS,
MAX_EXTENTS,
PCT_INCREASE,
STATUS,
CONTENTS
    from    dba_tablespaces
    order   by TABLESPACE_NAME ;

并且工作正常,但是当我尝试在存储过程中运行时:

CREATE OR REPLACE PROCEDURE TABLE_SPACE_INFO AS 
BEGIN
select  TABLESPACE_NAME,
INITIAL_EXTENT,
NEXT_EXTENT,
MIN_EXTENTS,
MAX_EXTENTS,
PCT_INCREASE,
STATUS,
CONTENTS
from    dba_tablespaces
order   by TABLESPACE_NAME ;
END TABLE_SPACE_INFO;

我得到一个编译错误:

Error(3,3): PL/SQL: SQL Statement ignored
Error(11,7): PL/SQL: ORA-00942: table or view does not exist

解决方案是什么?为什么会出错?

【问题讨论】:

标签: oracle stored-procedures oracle11g


【解决方案1】:

我认为您没有足够的权限访问dba_tablespaces。您应该在执行查询之前授予用户权限或授予 DBA 角色。

【讨论】:

    【解决方案2】:

    您可以为此使用软件包:

      create or replace PACKAGE YourPackge    AS   TYPE T_CURSOR IS REF CURSOR;
      PROCEDURE TABLE_SPACE_INFO(T_List OUT T_CURSOR);
      END;
    
      \
    
      create or replace   PACKAGE BODY  YourPackge as
      PROCEDURE TABLE_SPACE_INFO(T_List OUT T_CURSOR)
      IS
      BEGIN
        OPEN T_List FOR
      select  TABLESPACE_NAME,
      INITIAL_EXTENT,
      NEXT_EXTENT,
      MIN_EXTENTS,
      MAX_EXTENTS,
      PCT_INCREASE,
      STATUS,
      CONTENTS
      from    dba_tablespaces
      order   by TABLESPACE_NAME ;
      END TABLE_SPACE_INFO;
      END;
    

    【讨论】:

    • 错误(7,3):PL/SQL:SQL 语句被忽略错误(15,11):PL/SQL:ORA-00942:表或视图不存在我遇到了同样的问题,我使用系统用户
    • 永远不要使用 SYSTEM 用户 @Arquitecto... 创建自己的用户并授予适当的权限。
    【解决方案3】:

    您必须明确授予自己对 dba_tablespaces 的选择权才能在包中查看该表。存储过程或包不继承用户的角色特定于对象的权限。如:

    test.sql:

    create or replace procedure test as
      ret number;
    BEGIN
      select count(*) into ret
        from dba_tablespaces;
    end;
    /
    
    show errors
    

    运行它:

    SQL> @c:\bob\test
    
    Warning: Procedure created with compilation errors.
    
    Errors for PROCEDURE TEST:
    
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    4/3      PL/SQL: SQL Statement ignored    
    5/10     PL/SQL: ORA-00942: table or view does not exist
    
    SQL> connect sys/syspwd@mydb as sysdba
    Connected.
    SQL> grant select on dba_tablespaces to myuser;
    
    Grant succeeded.
    
    SQL> connect myuser/mypwd@mydb
    Connected.
    SQL> @c:\bob\test
    
    Procedure created.
    
    No errors.
    SQL>
    

    【讨论】:

    • 欢迎来到 SO。这是一个很好的答案,显示为你解释的方法。要完成它,只需添加有关 AUTHID CURRENT_USER 的注释。
    猜你喜欢
    • 2013-11-23
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多