Skip to content

嵌套子程序的调用

嵌套子程序的调用方式可以分为:递归调用、同级调用、父级调用、子级调用四种调用方式,在调用嵌套子程序前必须先声明和定义。

说明:

虚谷数据库嵌套子程序不支持重载(优先调用第一个满足名字的同名子程序)。

示例

递归调用

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