http://www.itpub.net/thread-1499223-13-1.html 125楼 我在会话中打开PL/Scope:
ALTER SESSION SET plscope_settings='identifiers:all' /
然后我创建了如下的表和包:
CREATE TABLE plch_stuff ( amount NUMBER , rating INTEGER ) / CREATE OR REPLACE PACKAGE plch_pkg IS PROCEDURE do_stuff; END plch_pkg; / CREATE OR REPLACE PACKAGE BODY plch_pkg ....... END plch_pkg; /
噢,抱歉,我不能让你看到包体的代码!请继续....我对PL/Scope的USER_IDENTIFIERS视图进行如下查询:
SELECT type, usage FROM user_identifiers WHERE object_name = 'PLCH_PKG' ORDER BY 1, 2 /
我看到这些结果:
TYPE USAGE ------------------ ----------- FUNCTION CALL ITERATOR DECLARATION ITERATOR REFERENCE LABEL DECLARATION PACKAGE DECLARATION PACKAGE DEFINITION PROCEDURE DECLARATION PROCEDURE DEFINITION VARIABLE DECLARATION VARIABLE REFERENCE VARIABLE REFERENCE
下面关于plch_pkg包的哪些句子是正确的?(A)
包体里面没有任何私有(PRIVATE)的子程序。
(B)
do_stuff过程里面可能包含一个FORALL语句。
(C)
包体里面必须包含一个PACKAGE级别的变量(即不是在do_stuff里面声明的)。
(D)
do_stuff过程必须包含一个GOTO语句。
答案说明在128楼
2011-11-9答案AB. (A) 包体里面没有任何私有(PRIVATE)的子程序。 对应每个包里定义的过程你会看到两条记录: PROCEDURE DECLARATION PROCEDURE DEFINITION 对应每个包里定义的函数你会看到两条记录: FUNCTION DECLARATION FUNCTION DEFINITION 结果里面只有这样一对: PROCEDURE DECLARATION PROCEDURE DEFINITION 它就是对应于do_stuff过程,不再有其他子程序了。 (B) do_stuff过程里面可能包含一个FORALL语句。 一个FORALL语句就像一个FOR循环,定义并且使用隐性游标。输出里这两行: ITERATOR DECLARATION ITERATOR REFERENCE 有可能对应FORALL语句。 (C) 包体里面必须包含一个PACKAGE级别的变量(即不是在do_stuff里面声明的)。 这仅仅是“可能”而非“必须”。我们知道包体里面某处定义了一个变量,根据是这两行输出: VARIABLE DECLARATION VARIABLE REFERENCE 但这个变量可能在do_stuff内部定义。为了确定这个变量是不是PACKAGE级的,你必须知道所有程序单元的最小行号,然后看看这个变量定义行号是否在此之前。 (D) do_stuff过程必须包含一个GOTO语句。 输出里面有这一行: LABEL DECLARATION 因此我们知道有一个标号被声明了,它可能出现在程序某处,像这样: <<label_name>> 但是输出里面并没有指示这个标号被引用, 否则的话我们应该看到另外一行输出: LABEL REFERENCE (newkid加注:即使看到标号被引用,也不意味着GOTO, 比如退出循环的EXIT也可以引用标号)
