Oracle dba表对存储过程的调用

Oracle dba表对存储过程的调用,oracle,stored-procedures,oracle11g,Oracle,Stored Procedures,Oracle11g,我是Oracle database 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 ; 工作正常,但当我尝试在存储过

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

解决方案是什么?为什么是错误的

您可以使用以下软件包:

  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;

您可以使用以下软件包:

  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;

我认为您没有足够的权限访问
dba\u表空间
。在执行查询之前,应该向用户授予特权或授予DBA角色

我认为您没有足够的权限访问
dba\u表空间
。在执行查询之前,应该向用户授予特权或授予DBA角色

您必须显式地向自己授予select on dba_表空间,以便在包中查看该表。存储过程或包不会继承用户的角色特定于对象的权限。例如:

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>

您必须显式地向自己授予select on dba_表空间,以便在包中查看该表。存储过程或包不会继承用户的角色特定于对象的权限。例如:

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>

可能的复制品不是一回事。这里是关于角色授权的,它在直接运行SQL时起作用,但在存储的PL/SQL代码中使用时会出现问题。可能的重复不是一回事。这里是关于grant by role的,它在直接运行SQL时工作,但在存储的PL/SQL CODEROR(7,3):PL/SQL:SQL语句忽略错误(15,11):PL/SQL:ORA-00942:表或视图不存在我遇到了同样的问题,我使用系统用户从不使用系统用户@Arquitecto。。。创建您自己的并授予适当的权限。错误(7,3):PL/SQL:SQL语句忽略错误(15,11):PL/SQL:ORA-00942:表或视图不存在我遇到了相同的问题,并且我使用系统用户从不使用系统用户@Arquitecto。。。创建您自己的并授予适当的权限。欢迎使用SO。这是一个很好的答案,采用“边解释边展示”的方法。要完成它,只需添加关于AUTHID CURRENT_USER的注释。欢迎使用SO。这是一个很好的答案,采用“边解释边展示”的方法。要完成它,只需添加关于AUTHID当前用户的注释。