2016-11-21 63 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;