Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Czytanie clob linia po linii z pl\sql

Oto fragment kodu, który działa. Sugeruję używanie jawnych kursorów zamiast niejawnych (FOR i IN (wybierz...)), w celu zapewnienia wydajności.

Najpierw jest skrypt do tworzenia przypadku testowego.

create table test (c clob);

insert into test (c) values (
'azertyuiop
qsdfghjklm
wxcvbn
');

Oto skrypt do czytania wiersz po wierszu Clob :

/* Formatted on 28/08/2012 14:16:52 (QP5 v5.115.810.9015) */
declare
    nStartIndex number := 1;
    nEndIndex number := 1;
    nLineIndex number := 0;
    vLine varchar2(2000);

    cursor c_clob is
    select c from test;

    c clob;
    -------------------------------
    procedure printout
       (p_clob in out nocopy clob) is
      offset number := 1;
      amount number := 32767;
      len    number := dbms_lob.getlength(p_clob);
      lc_buffer varchar2(32767);
      i pls_integer := 1;
    begin
      if ( dbms_lob.isopen(p_clob) != 1 ) then
        dbms_lob.open(p_clob, 0);
      end if;
      amount := instr(p_clob, chr(10), offset);
      while ( offset < len )
      loop
        dbms_lob.read(p_clob, amount, offset, lc_buffer);
        dbms_output.put_line('Line #'||i||':'||lc_buffer);
       offset := offset + amount;
       i := i + 1;
      end loop; 
          if ( dbms_lob.isopen(p_clob) = 1 ) then
        dbms_lob.close(p_clob);
      end if; 
    exception
      when others then
         dbms_output.put_line('Error : '||sqlerrm);
    end printout;
    ---------------------------
begin
    dbms_output.put_line('-----------');
    open c_clob;
    loop
       fetch c_clob into c;
       exit when c_clob%notfound;
       printout(c);
    end loop;
    close c_clob;
end;

Zmienna „amount” służy do wykrywania pozycji końca wiersza. Bądź ostrożny, w niektórych przypadkach koniec linii to CHR(10)||CHR(13) (CR + LF), a w innych przypadkach jest to tylko CHR(10).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja JSON_ARRAYAGG() w Oracle

  2. EM12c umożliwia teraz DB12c dla repozytoriów

  3. Oracle:jak pogrupować według zakresu?

  4. ORA-28001:Hasło wygasło

  5. Jak dodać numer kolejny dla każdego elementu w grupie za pomocą zapytania SQL bez tabel tymczasowych