如何遍历类型为SYS_REFCURSOR的存储过程的记录

时间:2018-10-08 10:54:14

标签: oracle plsql oracle12c

我是oracle新手。问题是存在一个具有以下参数的现有过程

   P_ENTT        IN     PURCHASEORDER.POCODE%TYPE,
   P_LOCCODE     IN     LOCATION.LOCATIONCODE%TYPE,
   P_PROCESSID   IN     VARCHAR,
   V_TAXREF         OUT SYS_REFCURSOR

我正在编写一个新过程,该过程将遍历上述过程返回的记录。我曾尝试使用如下的Loop关键字

FOR rec IN (OLDProcedure(Old_params))
  LOOP
     -- some calculations

  END LOOP;

但是无法实现相同的功能。在这种情况下,如何在存储过程中循环遍历返回的记录。

2 个答案:

答案 0 :(得分:2)

根据下面显示的Anonymous块重写您的过程。请阅读内联的注释以理解。

DECLARE
  --Variable of type of your procedure `OUT` paramater
  var sys_refcursor;
 --Columns selected in your sys_refcursor query
  var1 NUMBER;
  var2 NUMBER;
  var3 NUMBER;
BEGIN
 --call your existing procedure in new procedure
 myProc( P_ENTT =>1,  V_TAXREF => var); --Pass other parameters as well
  --Loop to get your records
  LOOP
   --Fetch records of your sys_refcursor to variables
    FETCH var INTO var1,var2,var3;
    EXIT  WHEN var%notfound;
    --Display your records 
    dbms_output.put_line(var1);
  END LOOP;
END;

答案 1 :(得分:1)

正如@XING在上面的答案中所暗示的,我将明确指出,您不能将带有游标变量的游标用于循环。因此,您打开了游标变量,然后使用带有显式访存,退出时和关闭语句的简单循环。

但是您可能会问:@XING为什么不关闭光标?由于是在本地声明的,因此当块终止时,PL / SQL引擎将自动关闭游标变量。

感谢PL / SQL!