2011-05-31 63 views
0

可能重複:
How can multiple rows be concatenated into one in Oracle without creating a stored procedure?如何在Oracle使用光標插入從源表中的多個行到單個行中目標表

create table pr_info(
    pr_ref varchar2(10), 
    pr_text varchar2(3), 
    pr_key varchar2(12) 
) 

該表包含在數據以下格式

pr_ref pr_text pr_key 
a1  abc  qwertyui01 
a1  def  qwertyui02 
b1  aaa  zxcvbnmj01 
b1  bbb  zxcvbnmj02 
b1  ccc  zxcvbnmj03 

也就是說,如果pr_text的長度超過3個字符,則記錄將被拆分並放入具有相同pr_ref但不同pr_key的新記錄中(在這種情況下,前8個字符將保持不變,但最後兩個字符將表示記錄的序列)

所以現在我需要把這個表的數據爲它具有以下sprecification

create table pv_cus(pv_ref vrachar2(10),pv_text varchar2(100)) 

所以基本上我需要連接屬於由同一人行的新表源表並將其放在目標表中的一行中。

pv_ref pv_text  
a1  abc,def  
b1  aaa,bbb,ccc  

回答

0

程序方法

DECLARE 

    type pv_ref_t is TABLE of pv_cus.pv_ref%type; 
    type pv_text_t is TABLE of pv_cus.pv_text%type; 
    v_pv_ref_tab pv_ref_t; 
    v_pv_text_tab pv_text_t; 
    v_last_pr_ref pr_info.pr_ref%type; 
BEGIN 
    v_pv_ref_tab := pv_ref_t(); 
    v_pv_text_tab := pv_text_t(); 

    FOR rec in (SELECT pr_ref, pr_text FROM pr_info order by pr_ref, pr_key) 
    LOOP 
    IF v_last_pr_ref IS NULL 
    OR v_last_pr_ref != rec.pr_ref 
    THEN 
     v_last_pr_ref := rec.pr_ref; 
     v_pv_ref_tab.extend(1); 
     v_pv_text_tab.extend(1); 
     v_pv_ref_tab(v_pv_ref_tab.last) := rec.pr_ref; 
     v_pv_text_tab(v_pv_text_tab.last) := rec.pr_text; 
    ELSE 
     -- tbd: check length of v_pv_text_tab(v_pv_text_tab.last) 
     v_pv_text_tab(v_pv_text_tab.last) := v_pv_text_tab(v_pv_text_tab.last) || ',' || rec.pr_text; 
    END IF; 

    END LOOP; 

    FORALL i in 1..v_pv_ref_tab.last 
    INSERT INTO pv_cus (pv_ref, pv_text) VALUES(v_pv_ref_tab(i), v_pv_text_tab(i)) 
    ; 
END; 
/
相關問題