2016-09-19 41 views
0

我有一个Oracle过程返回一个游标,其中有一个结果集,但使用我编写它的方式,它只返回最后一次迭代的结果我有的循环。如何使一个Oracle过程返回一个游标,其中有多行

这里是我的代码示例

  create or replace PROCEDURE PROC_SB_OBTENER_STATS_TEST (FECHA_INICIO IN DATE, FECHA_FIN IN DATE, RESULTADOS OUT SYS_REFCURSOR) AS 

      FECHAS SYS_REFCURSOR; 
      FECHA_BUSQUEDA DATE; 
      BEGIN 
      FECHAS := FUN_SB_OBTENER_FECHAS(FECHA_INICIO, FECHA_FIN); 


      LOOP 
      FETCH FECHAS 
      INTO FECHA_BUSQUEDA; 
      EXIT WHEN FECHAS%notfound; 

      OPEN RESULTADOS FOR 
      --Here I got a select where the condition uses the variable FECHA_BUSQUEDA 
      END LOOP; 
      CLOSE FECHAS; 

      END PROC_SB_OBTENER_STATS_TEST; 

程序编译和运行,但它只返回我的光标,最后选择它执行(如果我把10之间的日期/ 10/12和12/10/12它只返回12/10/12的结果)。

如何使OPEN FOR将查询的结果添加到其当前内容中,而不是将其全部覆盖并只显示最后一个结果?

+0

您需要接受查询,为您提供fecha_busqueda并将结果查询加入到查询中。也就是说,不是有两个单独的查询,你手动加入到PL/SQL中(这就是你正在做的),只需要一个查询来完成SQL中的连接。这样,您可以将它声明为引用游标,并将其传递给调用程序,以便根据需要进行循环。 – Boneist

+0

RESULTADOS是一个游标,FECHA_BUSQUEDA是一个日期,我使用FECHA_BUSQUEDA作为select查询的值,并将其插入到RESULTADOS游标中。 –

回答

0
CREATE OR REPLACE TYPE DATEARRAY IS TABLE OF DATE; 

create or replace PROCEDURE PROC_SB_OBTENER_STATS_TEST (FECHA_INICIO IN DATE, FECHA_FIN IN DATE, RESULTADOS OUT SYS_REFCURSOR) AS 

     FECHAS SYS_REFCURSOR; 
     FECHA_BUSQUEDA DATEARRAY; 
     BEGIN 
     FECHAS := FUN_SB_OBTENER_FECHAS(FECHA_INICIO, FECHA_FIN); 



     FETCH FECHAS 
     BULK COLLECT INTO FECHA_BUSQUEDA; 

     OPEN RESULTADOS FOR 
     --Here I got a select: 
     SELECT * FROM YOUR_TABLE T WHERE T.DATE IN (SELECT v.COLUMN_VALUE FROM TABLE(FECHA_BUSQUEDA) v) 

     CLOSE FECHAS; 

     END PROC_SB_OBTENER_STATS_TEST; 
+0

我不知道BULK COLLECT的存在(谢谢),但鉴于我的选择查询的性质,我必须单独选择每个日期(不使用'IN(日期,日期,日期)'),这就是为什么我使用循环。 –

相关问题