ALL_PROCEDURES视图不显示PROCEDURE_NAME

时间:2015-02-23 11:39:42

标签: sql oracle view plsql metadata

为什么我在user_procedures视图中看不到我的程序?为什么procedure_name视图上的all_procedures过滤器不返回任何行。

这个问题主要是为了帮助那些正在寻找类似问题的人。我希望任何寻找这样问题的人都能在这里找到答案。

测试案例

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>

1 个答案:

答案 0 :(得分:3)

来自documentation

  

ALL_PROCEDURES列出了所有功能和程序,以及   相关属性。例如,ALL_PROCEDURES指示是否   或者不是功能是流水线,并行启用或聚合   功能。如果函数是流水线或聚合函数,则   还确定了相关的实施类型(如果有的话)。

它没有说明它是否会以相同的方式列出 STAND ALONE PROCEDURE 和包含在 PACKAGE 中的程序,或者它是否以不同的方式考虑它。因为,procedure_name不会列出独立程序的名称,如上述问题中的测试用例所示。

PROCEDURE_NAME列仅包含属于PACKAGE的过程的过程名称。对于STAND ALONE PROCEDURES,您需要使用 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视图中维护信息是很好的。