我從程序中獲取clob作爲參數,並且它包含一個CSV文件。我需要讀取這些數據並將其加載到另一個Oracle表中。如何使用PL/SQL從Oracle中的Clob列讀取CSV數據
有人可以請解釋如何做到這一點。
我從程序中獲取clob作爲參數,並且它包含一個CSV文件。我需要讀取這些數據並將其加載到另一個Oracle表中。如何使用PL/SQL從Oracle中的Clob列讀取CSV數據
有人可以請解釋如何做到這一點。
我不知道的解析CLOB爲CSV的直接方式,但Oracle提供了許多工具與CSV工作文件如External Tables和SQL*Loader。
因此,一個方法可能是:
不要將數據導出到文件。
您需要將clob轉換爲有用的東西,解析它,然後寫入其他表。以下是您需要執行的步驟:
CSVReader reader = new CSVReader(the_reader_from_getCharacterStream);
ftwOracle's CLOB Object提供了一些有用的方法。
CSVReader
來自Open CSV。
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中。在上面的例子中,我使用了我自己的一個。
其他有趣的資源:
你還可以發佈你的JH_UTIL.SPLIT()函數嗎? –
@davor我不會在這裏發佈它,但可以在[Bitbucket]中找到(https://bitbucket.org/janihur/orasql-ex/src/c39936d5c35b/packages/?at=default) – user272735
您正在使用什麼版本的Oracle?它可能會對答案產生影響。 –