为什么我在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>
答案 0 :(得分:3)
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视图中维护信息是很好的。