zoukankan      html  css  js  c++  java
  • 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


     


     

  • 相关阅读:
    #256 (Div. 2)A. Rewards
    1113 矩阵快速幂
    1108 距离之和最小V2
    1287 加农炮
    1191 消灭兔子
    1051 最大子矩阵
    1086 背包
    1105 第K大的数
    2016 CCPC 网络赛 B 高斯消元 C 树形dp(待补) G 状压dp+容斥(待补) H 计算几何
    Educational Codeforces Round 18 C dp,思维 D lowbit,思维
  • 原文地址:https://www.cnblogs.com/SharkXu/p/DB2recursion.html
Copyright © 2011-2022 走看看