动态调用存储过程

目标:

在主存储过程的一个for循环中需要根据不同情况调用不同的子存储过程来完成相应动作

 

实现:

   --1、对目标定单执行检查
   oNextItemId :=1;
   for checkItems IN(
       SELECT * FROM CHECK_ITERM CI WHERE 1=1 ORDER BY CI.ITEM_ID
   ) loop
      if oNextItemId=9999 then
	       return;
      end if;
      --判断当前检查项是不是上次检查跳转到的目标检查项,或者上次检查未要求跳转
      if oNextItemId is null or checkItems.item_id =oNextItemId then
        vCnt :=vCnt+1;
        vProcedureName :=checkItems.CHECK_METHOD;
        dbms_output.put_line('--> 第'||vCnt||'项:'||checkItems.item_name||' ......................');
        --动态调用相应检查项的存储过程
        EXECUTE IMMEDIATE 'begin '||vProcedureName||'(:1,:2, :3, :4, :5);'||' end;'
                USING iExtSoNbr, out oRetCode, out oRetMsg, out oPatternId, out oNextItemId;
        --如果当前检查项发现异常,则中断检查任务
        if oRetCode =0 then
           --dbms_output.put_line('-->检查结果:[异常]');
           dbms_output.put_line(''||oRetMsg||CHR(10));    
           exit;
        else
           null;
           --dbms_output.put_line('-->检查结果:[正常]');
           dbms_output.put_line(''||oRetMsg||CHR(10));        
        end if;
      end if;    
   end loop;
    
 

 

你可能感兴趣的:(存储过程)