oracle - ALL_PROCEDURES View 不显示 PROCEDURE_NAME

标签 oracle stored-procedures plsql view metadata

为什么我在 user_procedures View 中看不到我的过程?为什么 all_procedures View 上的 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.

它没有阐明它是否会以相同的方式列出STAND ALONE PROCEDURE 和包装在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 View 中的信息。

关于oracle - ALL_PROCEDURES View 不显示 PROCEDURE_NAME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28672956/

相关文章:

Oracle 从表中选择最大 id 返回空值

Oracle Jar 在 Maven 打包中导致警告

sql-server - 导入 SQL Server 中现有的存储过程

java - 将逗号分隔的字符串传递给存储过程中的 IN 子句

oracle - PL/SQL 的代码覆盖率

sql - 顶点 : Submit without refreshing the page

java - 如何使用 Java 连接到特定数据库?

Oracle:我在哪里保存配置设置?

MySQL存储过程回滚的原因

oracle - 在 oracle 数据库 12c 中删除对象而不生成归档日志