PL/SQL Challenge 每日一题:2014-11-5 ALL_PROCEDURES数据字典

[复制链接]
查看11 | 回复6 | 2008-9-15 01:28:12 | 显示全部楼层 |阅读模式
(原发表于2010-8-27)

最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。
以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808
原始出处:
http://www.plsqlchallenge.com/
作者:Steven Feuerstein
运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品
下列关于ALL_PROCEDURES数据字典的说法哪些是正确的?
(A)
你可以利用这个试图来确定你的程序中有哪些是嵌套表函数。
(B)
如果程序单元是一个模式级别(schema-level)的过程或函数,那么object_name列是非空的,而procedure_name列则是NULL。
(C)
这个视图允许你确定模式级别的程序单元是何种类型:PROCEDURE, FUNCTION, TRIGGER, TYPE 或者 PACKAGE.
(D)
你可以用这个视图来确定包里的哪些子程序是重载(overloaded)的。
(E)
你可以用这个视图来确定包里的哪些子程序是函数,哪些是过程。
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案:ABCD
SYS@orcl> desc all_procedures
名称
是否为空? 类型
---------------------------------------- -------- ---------------------------
OWNER
VARCHAR2(30)
OBJECT_NAME
VARCHAR2(30)
PROCEDURE_NAME
VARCHAR2(30)
OBJECT_ID
NUMBER
SUBPROGRAM_ID
NUMBER
OVERLOAD
VARCHAR2(40)
OBJECT_TYPE
VARCHAR2(19)
AGGREGATE
VARCHAR2(3)
PIPELINED
VARCHAR2(3)
IMPLTYPEOWNER
VARCHAR2(30)
IMPLTYPENAME
VARCHAR2(30)
PARALLEL
VARCHAR2(3)
INTERFACE
VARCHAR2(3)
DETERMINISTIC
VARCHAR2(3)
AUTHID
VARCHAR2(12)
A SELECT * FROM ALL_PROCEDURES T WHERE T.pipelined='YES';
C 看OBJECT_TYPE
D 看overload
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
(E)
你可以用这个视图来确定包里的哪些子程序是函数,哪些是过程。
用哪个视图查看
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
〇〇 发表于 2014-11-8 19:55
(E)
你可以用这个视图来确定包里的哪些子程序是函数,哪些是过程。
用哪个视图查看

ALL_PROCEDURES


回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
试图->视图


回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
oracle_cj 发表于 2014-11-8 23:10
ALL_PROCEDURES

那2楼为什么没选E
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案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列提供了模式级别的程序单元的类型,但不是包中的类型。以我的经验,这是令人讨厌的缺陷。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行