为什么我不能在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>发布于 2015-02-23 11:39:42
来自文档,
ALL_PROCEDURES列出了所有函数和过程以及相关的属性。例如,ALL_PROCEDURES指示函数是流水线函数、并行启用函数还是聚合函数。如果函数是流水线的或聚合函数,则关联的实现类型(如果有的话)也会被标识出来。
它没有说明它是否会以相同的方式列出独立过程和包装在包中的过程,也没有说明它是否会以不同的方式看待它。因为,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。
当然,主要是在生产系统中,我们会有包,而不是独立的程序。但是,在测试和演示时,我们确实编译和运行独立的过程。因此,了解甲骨文如何维护*_PROCEDURES views中的信息是很好的。
https://stackoverflow.com/questions/28672956
复制相似问题