Monday, March 5, 2018

Read CLOB line by line






create table nrr_test_clob (c clob);

truncate table nrr_test_clob

insert INTO nrr_test_clob (c) values (
'<REPORT>
  <HEADER>
   <REPORT_NAME> WMS PICK TASK RELEASE</REPORT_NAME>
     <REQUEST_ID> 236560596</REQUEST_ID>
     <REQDATE> 02-MAR-2018 04:53:2525 PM</REQDATE>
     <REQUSER> RAYKARN</REQUSER>
     <FROM_DATE> 11-JAN-2018 01:00:0000 AM</FROM_DATE>
     <TO_DATE> 19-JAN-2018 09:00:0000 PM</TO_DATE>
     <FACILITY> WPC</FACILITY>
     <ORG> </ORG>
     </HEADER>
     <DATE_SUMMARY>
     <DATE_ROW>
     <COUNT_PREV>2447</COUNT_PREV>
     <COUNT_TODAY>0</COUNT_TODAY>
     <COUNT_TOMORROW>0</COUNT_TOMORROW>
     <COUNT_WEEK>644</COUNT_WEEK>
     <COUNT_MONTH>697</COUNT_MONTH>
     <COUNT_FUTURE>39</COUNT_FUTURE>
     </DATE_ROW>
     </DATE_SUMMARY>
     </REPORT>');
----------------------------------------------------------------------------------------------------------------------

select to_char(regexp_substr(test.c, '.+', 1, level)) pattern
from nrr_test_clob test
connect by level <= regexp_count(test.c, '.+');


----------------------------------------------------------------------------------------------------------------------


DECLARE

   l_clob   clob ;
   l_offset number := 1;
   l_amount number := 32767;
   l_length    number ;
   lc_buffer varchar2(32767);
   i   pls_integer := 1;
   idx pls_integer := 0;


   -- For UNIX type file - replace CHR(13) to NULL
   C_CR char := chr(13); -- carriage return
   --CR char := NULL;
   C_LF char := chr(10); --line feed
   
BEGIN


   SELECT c
   INTO   l_clob
   FROM   nrr_test_clob ;
 
   l_length := dbms_lob.getlength(l_clob);

   dbms_output.put_line('l_length => '||l_length) ;
 
   <<len_lbl1>>
   WHILE ( l_offset < l_length ) LOOP
 
      idx := idx + 1;
     
      dbms_output.put_line(idx||' l_offset => '||l_offset||' l_length => '||l_length) ;
 
      -- If no more newlines are found, read till end of CLOB
      IF (instr(l_clob, c_lf, l_offset) = 0) THEN
       
         l_amount := l_length - l_offset + 1;
   
      ELSE
   
         l_amount := instr(l_clob, c_lf, l_offset) - l_offset;
       
      END IF;
   
      dbms_output.put_line('l_amount => '||l_amount) ;
 
      -- This is to catch empty lines, otherwise we get a NULL error
      IF  ( l_amount = 0 ) THEN
   
         lc_buffer := '';
   
      ELSE
   
         dbms_lob.read(l_clob, l_amount, l_offset, lc_buffer);
   
      END IF;
   
      dbms_output.put_line('Line #'||i||':'||lc_buffer);


      -- This is to catch a newline on the last line with 0 characters behind it
   
   
      IF (instr(l_clob, c_lf, l_offset) = l_length) THEN
   
         lc_buffer := '';
   
         dbms_output.put_line('Line #'||idx||':'||lc_buffer);
   
      END IF;

      l_offset := l_offset + l_amount + 1;
 
   END LOOP len_lbl1 ;
 
 
END ; 

No comments:

Post a Comment