2016-11-21 12 views
0

我必須使用clob中的數據在循環中執行查詢並將每個查詢的結果存儲在遊標中。但是我不知道如何/在哪裏打開遊標。如果我在循環中這樣做,那麼我假設只有最後一個查詢的數據會出現。如何將查詢的結果放入PL SQL過程中的Cursor循環中?

在這種情況下要走的路是什麼。

這就是我想實現:

https://www.mkyong.com/jdbc/jdbc-callablestatement-stored-procedure-cursor-example/

PROCEDURE PRC(
       P_DATE IN  VARCHAR, 
       P_CLOB IN  CLOB, 
       P_CUR  OUT SYS_REFCURSOR 
      ) IS 
    V_DATE         DATE; 
    V_STR         VARCHAR; 
BEGIN 
    V_DATE   := TO_DATE(P_DATE, 'DD/MM/YYYY'); 
    V_CLOB_LENGTH := DBMS_LOB.getlength(P_CLOB); 
    V_START_CHAR  := 1; 
    V_LEN   := 5; 

    WHILE (V_START_CHAR + V_LEN) <= V_CLOB_LENGTH 
    LOOP 
     V_STR   := SUBSTR(
            P_CLOB, 
            V_START_CHAR, 
            V_LEN 
           ); 
     V_START_CHAR := V_START_CHAR + V_LEN; 


    OPEN P_CUR FOR /* I know this is wrong */ 
     SELECT A , B, C 
     FROM TAB 
     WHERE DATE = V_DATE 
      AND COL = V_STR; 


    END LOOP; 
END PRC; 
+0

假設你可以在每個循環迭代中打開遊標;你想用打開的遊標做什麼? – Aleksej

+0

遊標不存儲查詢結果,所以我不確定你想要做什麼。 –

+0

您不能將數據存儲在遊標中;要爲每次使用不同過濾器的迭代運行遊標,您必須使用遊標參數;請參閱例如:https://docs.oracle.com/cloud/latest/db112/LNPLS/static.htm#BABHBHIC – Yellow75

回答

0

如果我是你,我會做了分塊在查詢中CLOB的,然後你可以簡單地加入該到你的表 - 如:

PROCEDURE PRC(P_DATE IN VARCHAR, 
       P_CLOB IN CLOB, 
       P_CUR OUT SYS_REFCURSOR) 
IS 
    v_length constant number := 5; 
BEGIN 
    OPEN p_cur FOR 
    SELECT tab.a, 
      tab.b, 
      tab.c 
    FROM tab 
      INNER JOIN (SELECT to_char(p_date, 'dd/mm/yyyy') dt, 
           dbms_lob.SUBSTR(p_clob, v_length, (LEVEL - 1)*v_length + 1) substring 
         FROM dual 
         CONNECT BY dbms_lob.SUBSTR(p_clob, v_length, (LEVEL - 1)*v_length + 1) IS NOT NULL) str 
      ON tab.dt = str.dt 
       AND tab.col = str.substring; 
END prc;