2011-10-20 9 views
0

プロシージャからパラメータとしてclobを取得していて、CSVファイルが含まれています。私はこのデータを読んでそれを別のOracleテーブルにロードする必要があります。PL/SQLを使用してOracleのClob列からCSVデータを読み取る方法

誰かがこれを行う方法を教えてください。

+1

使用しているOracleのバージョンは何?それは答えに影響を与えるかもしれません。 –

答えて

0

私はCSVとしてCLOBを解析するの即時方法を知りませんが、Oracleは、このようなExternal TablesSQL*LoaderとしてCSVファイルを操作するためのツールの数を提供します。

ので、アプローチがするかもしれません:DBMS_LOBUTL_FILE

  • を使用してファイルとして

    1. 輸出CLOB上記のCSVツールのいずれかを使用してファイルをロードします。
  • 2

    データをファイルにエクスポートしないでください。

    clobを有用なものに変換し、解析してから、別のテーブルに書き込む必要があります。

    1. ClobをClobから有用なものに変換します。 CLOB.getCharacterStream()は便利です。
    2. 変換されたClobオブジェクトからCSVデータを解析します。 CSVReader reader = new CSVReader(the_reader_from_getCharacterStream);ftw
    3. 他のテーブルに必要なデータを格納します。

    Oracle's CLOB Objectはいくつかの有用な方法を提供する。
    CSVReaderは、Open CSVである。

    3

    AFAIK Oracleにはこのための準備が整っていません。 1つの有望な候補者はDBMS_UTILITY.COMMA_TO_TABLEですが、それは全くオプションではありません非常に特別なタスクにheavily limitedです。だから、あなたの袖を転がして自分のものを作ってください。

    あなたの仕様が少し曖昧ですが、一つの選択肢はSPLIT機能です:

    create table so18t (
        id number, 
        csv clob 
    ); 
    
    insert all 
    into so18t values(1,'1,2,3'||chr(10)|| 
            '40,5,6'||chr(10)|| 
            '700,80,9'||chr(10)) 
    into so18t values(2,'aaa,bbb,ccc'||chr(10)|| 
            'ddd,eee,fff'||chr(10)|| 
            'ggg,hhh,iii'||chr(10)) 
    select 1 from dual; 
    
    declare 
        v_lines jh_util.stringlist_t; 
        v_values jh_util.stringlist_t; 
    begin 
        for rec in (select * from so18t order by id) loop 
        v_lines := jh_util.split(rec.csv, chr(10)); 
        for i in v_lines.first .. v_lines.last loop 
         dbms_output.put_line('line ' || i || ':'); 
         v_values := jh_util.split(v_lines(i)); 
         /* Do what you want with the values - I just print them */ 
         for j in v_values.first .. v_values.last loop 
         dbms_output.put_line('v_values(' || j || ') = ' || v_values(j)); 
         end loop; 
        end loop; 
        end loop; 
    end; 
    /
    show errors 
    

    プリント:讲义1コースのOracle

    line 1: 
    v_values(1) = 1 
    v_values(2) = 2 
    v_values(3) = 3 
    line 2: 
    v_values(1) = 40 
    v_values(2) = 5 
    v_values(3) = 6 
    line 3: 
    v_values(1) = 700 
    v_values(2) = 80 
    v_values(3) = 9 
    line 1: 
    v_values(1) = aaa 
    v_values(2) = bbb 
    v_values(3) = ccc 
    line 2: 
    v_values(1) = ddd 
    v_values(2) = eee 
    v_values(3) = fff 
    line 3: 
    v_values(1) = ggg 
    v_values(2) = hhh 
    v_values(3) = iii 
    
    PL/SQL procedure successfully completed. 
    

    はスプリットが、SO helpsを提供していません。上記の例では、自分のものを使っています。

    その他の興味深い資源:

    +0

    JH_UTIL.SPLIT()関数も投稿できますか? –

    +1

    @davorここでは投稿しませんが、[Bitbucket](https://bitbucket.org/janihur/orasql-ex/src/c39936d5c35b/packages/?at=default)で入手できます。 – user272735

    関連する問題