Oracle dba表对存储过程的调用
我是Oracle database 11g R2的新手,这是为了获取数据库表空间的信息。我像运行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 ; 工作正常,但当我尝试在存储过
.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当前用户的注释。