答案ABCD, 2楼得奖。
A: 只需检查PIPELINED列的值,如下:
SELECT * FROM ALL_PROCEDURES
WHERE pipelined = 'YES'
B: 仅当这一行的信息是一个包中的子程序(函数或者过程),procedure_name列才是非空的。
C: 是的,你只需检查ALL_PROCEDURES中的object_type列。注意这个视图仍然没有胖待产我们包中子程序的类型。换言之,即使视图中的这一行包含了包里的函数或者过程名称(在PROCEDURE_NAME列),OBJECT_TYPE 列的值仍然被设为"PACKAGE".
注意:object_type是在10.2之后的子版本中被加入的,不在10.2.0.1中。这个列也不在Oracle文档中(注:11g文档中已经有了)。
D: 在 Oracle10g 10.2.0.1, 这个视图并没有显示包括重载信息。你必须写一个如下所示的查询(感谢Sebastian Kolisk的思路)来看看一个子程序是否在视图中出现多次,从而得知是否重载:
SELECT object_name, procedure_name
FROM all_procedures
WHERE object_name = 'YOUR_PACKAGE_NAME_HERE'
AND owner = 'YOUR_SCHEMA_NAME_HERE'
HAVING COUNT (*) > 1
GROUP BY object_name, procedure_name;
在 10.2.0.4 及更高版本,日子就好过多了。如果新鲜加入的OVERLOAD列非空,那么包中的这个名字的子程序就是重载的。你可以用这个查询:
SELECT DISTINCT procedure_name
FROM ALL_PROCEDURES
WHERE object_name = 'YOUR_PACKAGE_NAME_HERE'
AND overload IS NOT NULL
E: 不幸的是,情况并非如此。这个视图并没有告诉我们包中子程序的类型。OBJECT_TYPE列提供了模式级别的程序单元的类型,但不是包中的类型。以我的经验,这是令人讨厌的缺陷。