ALL_PROCEDURES视图不显示PROCEDURE_NAME

问题描述 投票:3回答:1

为什么我在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>
oracle stored-procedures plsql view metadata
1个回答
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包装在程序包中时,您才能使用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如何在* PROPRODURES视图中维护信息。

© www.soinside.com 2019 - 2024. All rights reserved.