无法停止Oracle Queue - 无法找到被调用的程序单元:“SYS.DBMS_ASSERT”

时间:2010-06-07 09:57:07

标签: sql oracle plsql oracle10g oracle9i

无法停止和删除oracle队列 以下代码

BEGIN
DBMS_AQADM.STOP_QUEUE (
queue_name => 'TEST_QUEUE');

DBMS_AQADM.DROP_QUEUE(
queue_name => 'TEST_QUEUE');

END;
/

产生以下错误:

ERROR at line 1:
ORA-04068: existing state of packages has been discarded
ORA-04065: not executed, altered or dropped stored procedure "SYS.DBMS_ASSERT"
ORA-06508: PL/SQL: could not find program unit being called: "SYS.DBMS_ASSERT"
ORA-06512: at "SYS.DBMS_AQADM_SYS", line 3365
ORA-06512: at "SYS.DBMS_AQADM", line 167
ORA-06512: at line 5

这个问题的根本原因是什么?

更新:

SQL> SELECT * FROM USER_TAB_PRIVS where table_name='DBMS_ASSERT' and GRANTEE='TEST_USER'
...
GRANTEE=TEST_USER
OWNER=SYS
TABLE_NAME=DBMS_ASSERT
GRANTOR=SYS
PRIVILEGE=EXECUTE
GRANTABLE=NO
HIERARCHY=NO

SQL> SELECT * FROM USER_TAB_PRIVS where table_name='DBMS_AQADM' and GRANTEE='TEST_USER'
...
GRANTEE=TEST_USER
OWNER=SYS
TABLE_NAME=DBMS_AQADM
GRANTOR=SYSTEM
PRIVILEGE=EXECUTE
GRANTABLE=NO
HIERARCHY=NO

我已经在一些模式中检查了表USER_TAB_PRIVS,我可以看到表格名称为“DBMS_ASSERT”的记录仅存在于TEST_USER中的模式中。
用户具有EXECUTE权限。

2 个答案:

答案 0 :(得分:3)

在我看来,DBMS_ASSERT包不存在(不太可能,但我认为可能),或者您用于登录数据库的用户没有执行权限。通常,PUBLIC被授予对DBMS_ASSERT的EXECUTE访问权限,但可能在您的站点上已更改。检查DBMS_ASSERT和DBMS_AQADM上的EXECUTE权限授予。

答案 1 :(得分:1)

如果您之前没有遇到任何问题,那么ORA-04068错误会让我觉得调用链中的某些内容已经失效。您最近是否对安装应用了任何升级或补丁?

Oracle在$ ORACLE_HOME / rdbms / admin中提供了一个脚本utlrp,它将重新编译所有软件包并报告任何剩余的无效软件。让管理员运行它(作为SYS)。