Reading clob line by line with pl\sql

后端 未结 9 938
长情又很酷
长情又很酷 2020-12-02 00:53

In my project i use oracle as primary database and i\'ve faced a problem with parsing clob. So suppose we have a clob with value

   aaaaaa
   cccccc
   bbbbb         


        
9条回答
  •  旧巷少年郎
    2020-12-02 01:22

    I created a table called lixo_mq:

    CREATE TABLE LIXO_MQ (CAMPO1 VARCHAR2(4000))
    

    I copied printout procedure and changed it to work different:

    PROCEDURE PRINTOUT (P_CLOB IN OUT NOCOPY CLOB) IS
       V_APARTIR                     NUMBER (20);
       V_CONTAR                      NUMBER (20);
       V_LINHA                       VARCHAR2 (4000);
       V_REG                         NUMBER (20);
       V_CORINGA                     VARCHAR2 (10) := CHR (10);
       V_ERRO                        VARCHAR2 (4000);
    BEGIN
       IF (DBMS_LOB.ISOPEN (P_CLOB) != 1) THEN
          DBMS_LOB.OPEN (P_CLOB, 0);
       END IF;
    
       V_APARTIR                  := 1;
       V_REG                      := 1;
    
       WHILE DBMS_LOB.INSTR (LOB_LOC                       => P_CLOB
                            ,PATTERN                       => V_CORINGA
                            ,OFFSET                        => 1
                            ,NTH                           => V_REG
                            ) > 0
       LOOP
          V_CONTAR                   :=
                     DBMS_LOB.INSTR (LOB_LOC                       => P_CLOB
                                    ,PATTERN                       => V_CORINGA
                                    ,OFFSET                        => 1
                                    ,NTH                           => V_REG
                                    )
                   - V_APARTIR;
    
          IF V_APARTIR > 1 THEN
             V_LINHA                    :=
                             DBMS_LOB.SUBSTR (LOB_LOC                       => P_CLOB
                                             ,AMOUNT                        =>   V_CONTAR
                                                                               - 1
                                             ,OFFSET                        =>   V_APARTIR
                                                                               + 1
                                             );
          ELSE
             V_LINHA                    :=
                                     DBMS_LOB.SUBSTR (LOB_LOC                       => P_CLOB
                                                     ,AMOUNT                        => V_CONTAR
                                                     ,OFFSET                        => V_APARTIR
                                                     );
          END IF;
    
          INSERT INTO LIXO_MQ
                      (CAMPO1
                      )
               VALUES (   V_REG
                       || ':'
                       || V_LINHA
                      );
    
          COMMIT;
          V_APARTIR                  :=
                               DBMS_LOB.INSTR (LOB_LOC                       => P_CLOB
                                              ,PATTERN                       => V_CORINGA
                                              ,OFFSET                        => 1
                                              ,NTH                           => V_REG
                                              );
          V_REG                      :=   V_REG
                                        + 1;
       END LOOP;
    
       IF (DBMS_LOB.ISOPEN (P_CLOB) = 1) THEN
          DBMS_LOB.CLOSE (P_CLOB);
       END IF;
    EXCEPTION
       WHEN OTHERS THEN
          V_ERRO                     :=    'Error : '
                                        || SQLERRM;
    
          INSERT INTO LIXO_MQ
                      (CAMPO1
                      )
               VALUES (V_ERRO
                      );
    
          COMMIT;
    END PRINTOUT;
    

提交回复
热议问题