glcui 发表于 2016-11-18 10:13:09

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 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
  

  
页: [1]
查看完整版本: DB2 存储过程递归调用