嵌套子程序的调用
嵌套子程序的调用方式可以分为:递归调用、同级调用、父级调用、子级调用四种调用方式,在调用嵌套子程序前必须先声明和定义。
说明:
虚谷数据库嵌套子程序不支持重载(优先调用第一个满足名字的同名子程序)。
示例
递归调用
sql
DECLARE
TYPE t_varr IS VARRAY(20) OF INT;
v_varr t_varr;
ret INT;
idex INT:=8;
BEGIN
FUNCTION find_key(h IN INT,e IN INT,key_val INT) RETURN INT -- 声明并定义嵌套子过程
IS
d_varr t_varr;
mid INT;
BEGIN -- 嵌套子过程执行区开始
d_varr:=v_varr;
mid:=(h+e)/2;
IF (h>e) THEN
RETURN -1;
ELSEIF (d_varr(mid)=key_val) THEN
RETURN mid;
ELSEIF (find_key(h,mid-1,key_val)=-1) THEN -- 递归方式执行嵌套子过程
RETURN find_key(mid+1,e,key_val); -- 递归方式执行嵌套子过程
END IF;
END find_key; -- 嵌套子过程执行区结束
v_varr:=t_varr(15,2,7,6,8,3,25,8);
FOR i IN 1..v_varr.COUNT() LOOP
SEND_MSG('varr('||i||')='||v_varr(i));
END LOOP;
ret:=find_key(1,v_varr.COUNT(),idex); -- 调用下级嵌套子过程
if(ret=-1) THEN
SEND_MSG('Not find idex '||idex);
ELSE
SEND_MSG('Find idex '||idex||' in '||ret);
ENDIF;
END;
/
-- 输出
varr(1)=15
varr(2)=2
varr(3)=7
varr(4)=6
varr(5)=8
varr(6)=3
varr(7)=25
varr(8)=8
Find idex 8 in 5
调用同级子过程
sql
DECLARE
TYPE t_varr IS VARRAY(20) OF INT;
v_varr t_varr;
BEGIN
FUNCTION find_key(h IN INT,e IN INT,key_val INT) RETURN INT -- 声明并定义嵌套子过程
IS
d_varr t_varr;
mid INT;
BEGIN -- 嵌套子过程执行区开始
d_varr:=v_varr;
mid:=(h+e)/2;
IF (h>e) THEN
RETURN -1;
ELSEIF (d_varr(mid)=key_val) THEN
RETURN mid;
ELSEIF (find_key(h,mid-1,key_val)=-1) THEN
RETURN find_key(mid+1,e,key_val);
END IF;
END find_key; -- 嵌套子过程执行区结束
PROCEDURE find_res(idex IN INT) -- 声明并定义嵌套子过程
IS
ret INT;
BEGIN
ret:=find_key(1,v_varr.COUNT(),idex); -- 同级方式执行嵌套子过程
if(ret=-1) THEN
SEND_MSG('Not find idex '||idex);
ELSE
SEND_MSG('Find idex '||idex||' in '||ret);
ENDIF;
END find_res; -- 嵌套子过程执行区结束
v_varr:=t_varr(15,2,7,6,8,3,25,8);
find_res(2);
END;
/
-- 输出
Find idex 2 in
父级调用
sql
BEGIN
-- 声明和定义第一级子过程
PROCEDURE send_father(id IN INT) IS
BEGIN
-- 声明和定义第二级子过程
PROCEDURE send_2() IS
BEGIN
send_father(6);
END send_2;
-- 调用 SEND_MSG 子过程
SEND_MSG(id);
END send_father;
-- 调用第一级子过程
send_father(2);
END;
/
-- 输出
2