可能重复:
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
答案 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;
/