• DB2 存储过程递归调用


    一般方法是行不通的,例如:

    CREATE OR REPLACE PROCEDURE ZSICP1_DEPT_DEL(

    IN pDeptNo varchar(40))
    SPECIFIC ZSICP1_DEPT_DEL

    P1:Begin 
     declare sqlcode integer default 0;
     declare varDeptNo varchar(40);
      declare C_ChildDept   Cursor with return to client for

      select DeptNo from ZSicT1_Dept where FatherNO=pDeptNo;

     Open C_ChildDept;
     currsorloop:

     Loop

      Fetch C_ChildDept into varDeptNo;  

      if sqlcode=100 then
       leave currsorloop;
      end if;

      call ZSICP1_DEPT_DEL(varDeptNo);

     End loop;

     Close C_ChildDept;

     delete ZSicT1_Dept where DeptNo=pDeptNo;  

    End P1

    会报告:ERROR [429C3] [IBM][DB2/NT64] SQL20481N  创建或重新验证 "XJXU.ZSICP1_DEPT_DEL" 对象将引起无效的直接或间接自引用

    循环内的call ZSICP1_DEPT_DEL(varDeptNo) 必须改成==》execute immediate 'call ZSICP1_DEPT_DEL(''' || varDeptNo || ''')';

    完整的语句如下:

    CREATE OR REPLACE PROCEDURE ZSICP1_DEPT_DEL(

    IN pDeptNo varchar(40))
    SPECIFIC ZSICP1_DEPT_DEL

    P1:Begin
    declare sqlcode integer default 0;
    declare varDeptNo varchar(40);
    declare C_ChildDept Cursor with return to client for

    select DeptNo from ZSicT1_Dept where FatherNO=pDeptNo;

    Open C_ChildDept;
    currsorloop:

    Loop

    Fetch C_ChildDept into varDeptNo;

    if sqlcode=100 then
    leave currsorloop;
    end if;

    execute immediate 'call ZSICP1_DEPT_DEL(''' || varDeptNo || ''')';

    End loop;

    Close C_ChildDept;

    delete ZSicT1_Dept where DeptNo=pDeptNo;

    End P1


     


     

  • 相关阅读:
    【博弈论】囚徒困境
    【LTE与5G】
    【现代通信技术】绪论
    【操作系统】 逻辑结构
    【密码学】
    【计算机网络】网络应用
    部署docker仓库-Harbor
    ELK+filebeat收集K8S平台日志
    istio-http流量管理
    K8S集群部署istio
  • 原文地址:https://www.cnblogs.com/SharkXu/p/DB2recursion.html
Copyright © 2020-2023  润新知