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


     


     

  • 相关阅读:
    HDU 1501 Zipper(DFS)
    HDU 2181 哈密顿绕行世界问题(DFS)
    HDU 1254 推箱子(BFS)
    HDU 1045 Fire Net (DFS)
    HDU 2212 DFS
    HDU 1241Oil Deposits (DFS)
    HDU 1312 Red and Black (DFS)
    HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
    HDU 1022 Train Problem I(栈)
    HDU 1008 u Calculate e
  • 原文地址:https://www.cnblogs.com/SharkXu/p/DB2recursion.html
Copyright © 2011-2022 走看看