嵌套子程序
在匿名块内、包内或模式级别创建的子程序是嵌套子程序,只有在包的子程序或独立子程序中的嵌套子程序是存储在数据库中,匿名块内创建的嵌套子程序仅在当前块内有效。
注意:
嵌套子程序结束时必须显式指示结束的程序名。
示例
在匿名块中嵌套子程序
sql
DECLARE -- 匿名块的声明区开始
v1 INT;
v2 VARCHAR2;
BEGIN -- 匿名块的执行区开始
PROCEDURE subpro_1(c1 INT,c2 VARCHAR2)-- 声明并定义嵌套子过程
IS -- 嵌套子过程声明区开始
sub_v1 INT;
sub_v2 VARCHAR2(30) := ' ';
BEGIN -- 嵌套子过程执行区开始
sub_v1 := v1 + c1;
sub_v2 := v2 || c2;
v1:=sub_v1;
v2:=sub_v2;
SEND_MSG('v1='||sub_v1);
SEND_MSG('v2='||sub_v1);
END subpro_1; -- 嵌套子过程执行区结束
v1 := 1;
v2 := 'AA';
subpro_1(v1,v2);
END; -- 匿名块的执行区结束
/
在包的子程序中嵌套子程序
sql
--创建包头
CREATE OR REPLACE PACKAGE pack_2
AS
v1 INT;
v2 VARCHAR2;
PROCEDURE pro_1(c1 INT,c2 VARCHAR2); -- 在包头中声明子程序
FUNCTION func_1(c1 INT,c2 VARCHAR2) RETURN INT; -- 在包头中声明子程序
END;
--创建包体
CREATE OR REPLACE PACKAGE BODY pack_2
AS
PROCEDURE pro_1(c1 INT,c2 VARCHAR2) -- 在包体中定义子程序
AS
id INT;
name VARCHAR2;
BEGIN
PROCEDURE subpro_1(c1 INT,c2 VARCHAR2)-- 声明并定义嵌套子过程
IS -- 嵌套子过程声明区开始
sub_v1 INT;
sub_v2 VARCHAR2(30) := ' ';
BEGIN -- 嵌套子过程执行区开始
sub_v1 := v1 + c1;
sub_v2 := v2 || c2;
v1:=sub_v1;
v2:=sub_v2;
SEND_MSG('v1='||sub_v1);
SEND_MSG('v2='||sub_v1);
END subpro_1; -- 嵌套子过程执行区结束
v1 := 1;
v2 := 'sub_procedure';
subpro_1(v1,v2);
END pro_1;
FUNCTION func_1(c1 INT,c2 VARCHAR2) RETURN INT -- 在包体中定义子程序
AS
id INT;
name VARCHAR2;
BEGIN
FUNCTION subfunc_1(c1 int,c2 VARCHAR2) RETURN INT
IS -- 嵌套子过程声明区开始
sub_v1 INT;
sub_v2 VARCHAR2(30) := ' ';
BEGIN -- 嵌套子过程执行区开始
sub_v1 := v1 + c1;
sub_v2 := v2 || c2;
v1:=sub_v1;
v2:=sub_v2;
SEND_MSG('v1='||sub_v1);
SEND_MSG('v2='||sub_v1);
RETURN sub_v1;
END subfunc_1; -- 嵌套子过程执行区结束
v1 := 1;
v2 := 'sub_function';
v1:=subfunc_1(v1,v2); -- 执行嵌套子过程
END func_1;
END pack_2;
/
在独立程序中嵌套子程序
sql
CREATE OR REPLACE FUNCTION func_1(c1 INT,c2 VARCHAR2) RETURN INT
AS
id INT;
name VARCHAR2;
BEGIN
FUNCTION subfunc_1(c1 int,c2 VARCHAR2) RETURN INT
IS -- 嵌套子过程声明区开始
sub_v1 INT;
sub_v2 VARCHAR2(30) := ' ';
BEGIN -- 嵌套子过程执行区开始
sub_v1 := id + c1;
sub_v2 := name || c2;
id:=sub_v1;
name:=sub_v2;
SEND_MSG('v1='||sub_v1);
SEND_MSG('v2='||sub_v1);
RETURN sub_v1;
END subfunc_1; -- 嵌套子过程执行区结束
id := 1;
name := 'sub_function';
RETURN subfunc_1(id,name); -- 执行嵌套子过程
END func_1;
/