1

我是 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

解决方案是什么,为什么它错了?

4

3 回答 3

1

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

于 2013-10-13T16:59:18.813 回答
0

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

测试.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>
于 2013-10-13T17:54:00.073 回答
0

您可以为此使用软件包:

  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;
于 2013-10-13T05:54:48.790 回答