ALL_PROCEDURES 视图不显示 PROCEDURE_NAME

ALL_PROCEDURES view doesn't show the PROCEDURE_NAME

为什么我在 user_procedures 视图中看不到我的程序?为什么 all_procedures 视图 returns 上的 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>

来自 documentation,

ALL_PROCEDURES lists all functions and procedures, along with associated properties. For example, ALL_PROCEDURES indicates whether or not a function is pipelined, parallel enabled or an aggregate function. If a function is pipelined or an aggregate function, the associated implementation type (if any) is also identified.

它没有说明它是否会以相同的方式列出 独立程序 和包装在 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 视图 .

中的信息是件好事