sql >> データベース >  >> RDS >> Oracle

pl\sqlを使用してclobを1行ずつ読み取る

    動作するコードを次に示します。パフォーマンスのために、暗黙カーソル(FOR i IN(select ...))ではなく明示カーソルを使用することをお勧めします。

    まず、テストケースを作成するためのスクリプトです。

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

    次に、Clobを1行ずつ読み取るスクリプトを示します:

    /* 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;
    

    'amount'変数は、行末位置を検出するために使用されます。カーフルにしてください。行末がCHR(10)|| CHR(13)(CR + LF)の場合もあれば、CHR(10)のみの場合もあります。



    1. MySQL時間を変換する方法

    2. すべてのクエリをmysqlに記録します

    3. Hiveクエリ言語の主キーとインデックスは可能かどうか?

    4. SQL2008RDLファイルをSQL2005に変換する