如何使用oracle中的游标将源表中的多个行插入目标表中的单个行

时间:2011-05-31 10:13:17

标签: oracle plsql string-aggregation

  

可能重复:
  How can multiple rows be concatenated into one in Oracle without creating a stored procedure?

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    

1 个答案:

答案 0 :(得分: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;
/