2009-11-30 37 views
32

我正在比較三個Oracle模式。獲取Oracle數據庫中所有功能和過程的列表

我想獲得每個數據庫中使用的所有函數和過程的列表。這可能通過查詢嗎? (最好包括一個標誌,以確定它們是否編譯)

理想情況下,使用帶有標誌的單個查詢來表明函數/過程是否在每個模式中是理想的。但即使只是第一位也會比手動檢查每個模式更好。

回答

74
SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('FUNCTION','PROCEDURE','PACKAGE') 

STATUS列告訴你對象是有效還是無效。如果它無效,你必須嘗試重新編譯,ORACLE不能告訴你它是否會工作。

+0

[''TABLE''](https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:941629680330#3455235608260)有人可以給一個提示如何刪除函數/程序/包? – Bitterblue

+0

'drop function xxx','drop procedure xyz','drop package foobar' –

+0

有人建議對我的回答進行編輯,這樣'SELECT'語句只會選擇'OBJECT_NAME'而不是'*'。無論如何,這個編輯已被拒絕(除我以外的評論者); IMO至少應該選擇「OBJECT_NAME,OBJECT_TYPE,STATUS」來獲得有用的輸出。也就是說,'SELECT *'在這種情況下不會受到傷害。 –

4

對dba_arguments,dba_errors,dba_procedures,dba_objects,dba_source,dba_object_size進行描述。 其中每個都有用於查看過程和功能的圖片的一部分。 。

而且在DBA_OBJECTS的OBJECT_TYPE的包是用於定義和「PACKAGE BODY」爲 「一攬子」身體

如果你在同一個數據庫比較模式然後嘗試:

select * from dba_objects 
    where schema_name = 'ASCHEMA' 
    and object_type in ('PROCEDURE', 'PACKAGE', 'FUNCTION', 'PACKAGE BODY') 
minus 
select * from dba_objects 
where schema_name = 'BSCHEMA' 
    and object_type in ('PROCEDURE', 'PACKAGE', 'FUNCTION', 'PACKAGE BODY') 

並切換ASCHEMA和BSCHEMA的訂單

如果您還需要查看觸發器並在模式之間比較其他內容,則應該查看Article on Ask Tom about comparing schemas

相關問題