2016-08-01 51 views
0

我試圖插入長度爲43000的大型xml文件到clob如何使用綁定變量在表中插入大數據

asktom remcomanded使用綁定變量,但其鏈接被打破。

所以我的問題如何在綁定變量中插入大型xml文件。這是我的程序

CREATE OR REPLACE PROCEDURE sp_insert_xml 
(
p_id IN INT, 
p_xml IN clob 
) 
AS 

BEGIN 
declare x clob; 
y number(10); 

begin 
SELECT FILE into x from PROCESS_D where PROCESS_ID =1; 

select dbms_lob.getlength(x) into y from dual; 

DBMS_OUTPUT.PUT_LINE(y); 
end; 

--INSERT INTO TEST_ID VALUES (p_id, p_xml); 
END; 

我要拆分的長度,所以我可以將它們插入到表

+0

XML文檔來自哪裏?如果你只將它作爲一個字符串(所以不能直接從文件加載到數據庫中),你打算從哪個客戶端調用你的過程? –

+0

@AlexPoole @AlexPoole我的文檔是從一個應用生成的,並插入到一個表中,我想在塊語句中將這個'do​​cument'作爲一個查詢語句,然後將其分割,以便將其插入到另一個數據庫中。 – Moudiz

+0

不知道我關注。您的代碼將'process_d.file'放入CLOB中; XML文件是什麼?那麼什麼是'p_xml'?如果你已經有一個CLOB作爲變量,那麼我不確定這個問題是什麼。你是否試圖將其中一個CLOB分成32k塊,以便將它作爲varchar2存儲?或者你打算在調用你的過程之前[從短字符串構造一個CLOB](http://stackoverflow.com/a/17359646/266304)? –

回答

1

我不知道你爲什麼會想起來分割成CLOB存儲4K塊,因爲你的價值已經愉快地存儲爲CLOB ......但如果你真的願意,你可以使用一個分層查詢:

create or replace procedure sp_insert_xml (p_id in int) as 
    l_xml clob; 
    l_len pls_integer; 
    l_chunksize pls_integer := 4000; 
begin 
    select xml into l_xml from process_d where process_id = p_id; 

    l_len := dbms_lob.getlength(l_xml); 
    dbms_output.put_line(l_len); 

    insert into test_id (id, chunk_id, chunk_text) 
    select p_id, level, dbms_lob.substr(l_xml, l_chunksize, (l_chunksize * (level - 1)) + 1) 
    from dual connect by level <= ceil(l_len/l_chunksize); 
end; 
/

或者你可以使用遞歸子查詢分解,或PL/SQL循環:

for l_chunk_id in 0..floor(l_len/l_chunksize) loop 
    insert into test_id (id, chunk_id, chunk_text) 
    values (p_id, l_chunk_id, 
     dbms_lob.substr(l_xml, l_chunksize, (l_chunksize * l_chunk_id) + 1)); 
    end loop; 

但使用遞歸CTE或連接 - 你並不需要一個過程,你可以用普通的SQL來完成。

1
Try to use sqlldr insted of sqlplus. You don't need to chunk lob into smaller pcises 

1. Save your clobs into files(test.xml,test2.xml) 

2. On destination DB create destination table 

    create table clob_table(name varchar2(100), doc clob); 

3. create control file for sqlldr. 



    LOAD DATA 
    INFILE * 
    append 
     INTO TABLE clob_table 
     FIELDS TERMINATED BY ',' 
     (name char(100), 
     doc  LOBFILE(name) TERMINATED BY EOF 
     ) 
    BEGINDATA 
    test.xml 
    test2.xml 


5. execute sqlldr `sqlldr user/[email protected]_db control=load.ctl` 
+0

這個問題似乎是關於將現有的CLOB分成更小的塊,而不是從文件加載。這似乎是一件奇怪的事情,這個問題並不完全清楚;但是從評論來看,這個值並不是來自文件。 –

+0

在第二條評論中他說他想將文檔插入到其他數據庫。爲此,他需要將clob分解成chukns。 –

+0

因爲您不能在數據庫鏈接上使用LOB?好的,我沒有理解。在這種情況下,我可能會使用datapump,但它仍然不是很清楚真正需要什麼。 –

相關問題