2010-06-07 10 views
1

無法停止和刪除Oracle隊列。
下面的代碼無法停止Oracle隊列 - 找不到正在調用的程序單元:「SYS.DBMS_ASSERT」

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 

可能是什麼這個問題的根本原因?

UPDATE:

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特權。

回答

3

它看起來像我DBMS_ASSERT包不存在(不太可能,但我想可能),或者你用來登錄到數據庫的用戶沒有執行權限。通常,PUBLIC被授予對DBMS_ASSERT的EXECUTE訪問權限,但可能在您的站點上進行了更改。檢查DBMS_ASSERT和DBMS_AQADM上的EXECUTE權限授予。

+0

但我們不在代碼中使用DBMS_ASSERT。 – 2010-06-07 12:07:18

+0

@Vladimir:根據原始郵件中顯示的錯誤,DBMS_AQADM正在調用DBMS_ASSERT。 – 2010-06-07 12:12:58

+0

@Bob Jarvis:查看上面的更新。 – 2010-06-07 12:27:56

1

如果您之前完成此調用沒有任何問題,那麼ORA-04068錯誤使我認爲調用鏈中的某些內容已失效。您最近是否對安裝應用了任何升級或補丁?

Oracle在$ ORACLE_HOME/rdbms/admin中提供腳本utlrp,它將重新編譯所有軟件包並報告任何剩餘的無效。讓你的管理員運行它(如SYS)。

+0

我們只在一個模式上有這樣的問題。同一臺服務器上的所有其他架構今天都可以正常運行。 但我問我們的DBA團隊。 – 2010-06-07 12:47:36