我从过程中获取clob作为参数,它包含一个CSV文件。我需要读取这些数据并将其加载到另一个Oracle表中。
有人可以解释一下如何做到这一点。
答案 0 :(得分:3)
AFAIK Oracle没有现成的好东西。一个有希望的候选人是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。在上面的例子中,我使用了自己的一个。
其他有趣的资源:
答案 1 :(得分:2)
不要将数据导出到文件中。
您需要将clob转换为有用的东西,解析它,然后写入另一个表。以下是您需要执行的步骤:
CSVReader reader = new CSVReader(the_reader_from_getCharacterStream);
ftw Oracle's CLOB Object提供了一些有用的方法
CSVReader
来自Open CSV。
答案 2 :(得分:0)
我不知道将clob解析为CSV的直接方法,但Oracle提供了许多工具来处理CSV 文件,例如External Tables和{{3 }}
所以方法可能是: