2011-10-20 58 views
0

我从程序中获取clob作为参数,并且它包含一个CSV文件。我需要读取这些数据并将其加载到另一个Oracle表中。如何使用PL/SQL从Oracle中的Clob列读取CSV数据

有人可以请解释如何做到这一点。

+1

您正在使用什么版本的Oracle?它可能会对答案产生影响。 –

回答

0

我不知道的解析CLOB为CSV的直接方式,但Oracle提供了许多工具与CSV工作文件External TablesSQL*Loader

因此,一个方法可能是:

  1. 导出CLOB如使用DBMS_LOBUTL_FILE
  2. 负荷使用上面提到的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甲骨文没有现成的好东西。一个有前途的候选人是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 

打印:

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. 

五言Oracle不提供分,但SO helps中。在上面的例子中,我使用了我自己的一个。

其他有趣的资源:

+0

你还可以发布你的JH_UTIL.SPLIT()函数吗? –

+1

@davor我不会在这里发布它,但可以在[Bitbucket]中找到(https://bitbucket.org/janihur/orasql-ex/src/c39936d5c35b/packages/?at=default) – user272735

相关问题