2016-11-21 7 views
0

ループ内でクエリを実行し、各クエリの結果をカーソルに格納するには、clobのデータを使用する必要があります。しかし、私はどのように/どこにカーソルを開くか分からない。私はループでそれを行う場合、私は最後のクエリのデータだけが存在すると仮定します。PL SQLプロシージャのカーソル内のループ内に問合せの結果を入れる方法は?

このような状況になる方法は何ですか。

これは私が達成しようとしているものです:

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; 
関連する問題