3. 前向声明(Forward Declarations) 由于本地P L / S Q L子程序的名称是标识符,所以它们必须在引用前声明。一般来说,满足这 种要求不是一件困难的事情。然而,在具有相互引用的子程序中,实现上述要求就有一定的难 度。请看下面的例子: 节选自在线代码mutual.sql DECLARE v_TempVal BINARY_INTEGER := 5; -- Local procedure A. Note that the code of A calls procedure B. PROCEDURE A(p_Counter IN OUT BINARY_INTEGER) IS BEGIN DBMS_OUTPUT.PUT_LINE('A(' || p_Counter || ')'); IF p_Counter > 0 THEN B(p_Counter); p_Counter := p_Counter - 1; END IF; END A; -- Local procedure B. Note that the code of B calls procedure A. PROCEDURE B(p_Counter IN OUT BINARY_INTEGER) IS BEGIN DBMS_OUTPUT.PUT_LINE('B(' || p_Counter || ')'); p_Counter := p_Counter - 1; A(p_Counter); END B; BEGIN B(v_TempVal); END;该例子无法进行编译,其原因是过程 A调用了过程B,因此过程B必须要在过程A之前声明以 便可以确定对过程B的引用。同时,由于过程B要调用过程A,要求过程A也要在过程B之前声明 以便对确定对过程B的引用。在这种情况下,上述要求不能同时满足。为了协调这种需求,我们 可以使用前向声明来解决该问题。前向声明只需要提供过程名和其形参就可以实现相互引用的 过程的并存。除此之外,前向声明还可以用在包头中。
--使用包 --创建包头 CREATE OR REPLACE PACKAGE mypack AS PROCEDURE a; PROCEDURE b; END; / --创建包体 CREATE OR REPLACE PACKAGE BODY mypack AS PROCEDURE a IS BEGIN b; dbms_output.put_line('in proc a'); END; PROCEDURE b IS BEGIN a; dbms_output.put_line('in proc b'); END; END; / /
由于本地P L / S Q L子程序的名称是标识符,所以它们必须在引用前声明。一般来说,满足这
种要求不是一件困难的事情。然而,在具有相互引用的子程序中,实现上述要求就有一定的难
度。请看下面的例子:
节选自在线代码mutual.sql
DECLARE
v_TempVal BINARY_INTEGER := 5;
-- Local procedure A. Note that the code of A calls procedure B.
PROCEDURE A(p_Counter IN OUT BINARY_INTEGER) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('A(' || p_Counter || ')');
IF p_Counter > 0 THEN
B(p_Counter);
p_Counter := p_Counter - 1;
END IF;
END A;
-- Local procedure B. Note that the code of B calls procedure A.
PROCEDURE B(p_Counter IN OUT BINARY_INTEGER) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('B(' || p_Counter || ')');
p_Counter := p_Counter - 1;
A(p_Counter);
END B;
BEGIN
B(v_TempVal);
END;该例子无法进行编译,其原因是过程 A调用了过程B,因此过程B必须要在过程A之前声明以
便可以确定对过程B的引用。同时,由于过程B要调用过程A,要求过程A也要在过程B之前声明
以便对确定对过程B的引用。在这种情况下,上述要求不能同时满足。为了协调这种需求,我们
可以使用前向声明来解决该问题。前向声明只需要提供过程名和其形参就可以实现相互引用的
过程的并存。除此之外,前向声明还可以用在包头中。
--创建包头
CREATE OR REPLACE PACKAGE mypack AS
PROCEDURE a;
PROCEDURE b;
END;
/
--创建包体
CREATE OR REPLACE PACKAGE BODY mypack AS
PROCEDURE a IS
BEGIN
b;
dbms_output.put_line('in proc a');
END;
PROCEDURE b IS
BEGIN
a;
dbms_output.put_line('in proc b');
END;
END;
/
/