如何在Oracle使用光标插入从源表中的多个行到单个行中目标表

问题描述:

可能重复:
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  

程序方法

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; 
/