2016-09-19 43 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(日期,日期,日期)'),這就是爲什麼我使用循環。 –

相關問題