2015-02-23 23 views
2

爲什麼我在user_procedures視圖中看不到我的程序?爲什麼all_procedures視圖上的procedure_name篩選器未返回任何行。ALL_PROCEDURES視圖不顯示PROCEDURE_NAME

這個問題主要是爲了幫助那些正在尋找類似問題的人。我希望任何尋找這樣的問題的人都能在這裏找到答案。

測試用例:

SQL> show user 
USER is "LALIT" 
SQL> CREATE OR REPLACE 
    2 PROCEDURE new_proc 
    3 AS 
    4 BEGIN 
    5 NULL; 
    6 END; 
    7/

Procedure created. 

SQL> 
SQL> SELECT owner, 
    2 object_name, 
    3 procedure_name, 
    4 object_type 
    5 FROM all_procedures 
    6 WHERE owner='LALIT' 
    7 AND procedure_name='NEW_PROC'; 

no rows selected 

SQL> 

回答

2

documentation

ALL_PROCEDURES列出了所有的功能和程序, 相關屬性一起。例如,ALL_PROCEDURES指示 函數是否是流水線,並行啓用或聚合 函數。如果函數是流水線或聚合函數,則還會標識關聯的實現類型(如果有)。

它沒有說明是否會列出獨立程序和包裹在PACKAGE以同樣的方式或是否認爲這是不同的過程。因爲procedure_name不會列出上述問題的測試案例中看到的獨立程序的名稱。

PROCEDURE_NAME列將只包含作爲PACKAGE的一部分的過程的過程名稱。對於獨立程序,您需要使用OBJECT_NAME

SQL> show user 
USER is "LALIT" 
SQL> CREATE OR REPLACE 
    2 PROCEDURE new_proc 
    3 AS 
    4 BEGIN 
    5 NULL; 
    6 END; 
    7/

Procedure created. 

SQL> 
SQL> SELECT owner, 
    2 object_name, 
    3 procedure_name, 
    4 object_type 
    5 FROM all_procedures 
    6 WHERE owner='LALIT' 
    7 AND object_name='NEW_PROC'; 

OWNER OBJECT_NAME  PROCEDURE_NAME OBJECT_TYPE 
----- --------------- --------------- --------------- 
LALIT NEW_PROC      PROCEDURE 

SQL> 

只有將程序包裝在程序包中時,才能使用procedure_name獲取程序列表。

SQL> -- package 
SQL> CREATE OR REPLACE 
    2 PACKAGE new_pack 
    3 IS 
    4 PROCEDURE new_proc; 
    5 END new_pack; 
    6/

Package created. 

SQL> 
SQL> -- package body with a procedure 
SQL> CREATE OR REPLACE 
    2 PACKAGE BODY new_pack 
    3 IS 
    4 PROCEDURE new_proc 
    5 IS 
    6 BEGIN 
    7 NULL; 
    8 END; 
    9 END new_pack; 
10/

Package body created. 

SQL> SELECT owner, 
    2 object_name, 
    3 procedure_name, 
    4 object_type 
    5 FROM all_procedures 
    6 WHERE owner='LALIT' 
    7 AND procedure_name='NEW_PROC'; 

OWNER OBJECT_NAME  PROCEDURE_NAME OBJECT_TYPE 
----- --------------- --------------- ----------- 
LALIT NEW_PACK  NEW_PROC  PACKAGE 

SQL> 

現在您可以看到procedure_name爲實際過程,object_name爲package_name。

當然,主要是在生產系統中,我們會有包裝,而不是獨立的程序。但是,在進行測試和演示時,我們會編譯和運行獨立程序。因此,瞭解Oracle如何在* _PROCEDURES視圖中維護信息是很好的。