как вставить несколько строк из исходной таблицы в одну строку в целевой таблице с помощью курсора в Oracle

Возможный дубликат:
Как можно объединить несколько строк в одну в 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 символов останутся такими же, но последние два символа будут обозначать последовательность запись)

Итак, теперь мне нужно поместить данные этой таблицы в новую таблицу, которая имеет следующую спецификацию

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

Поэтому в основном мне нужно объединить строки, принадлежащие одному человеку из исходной таблицы, и поместить их в одну строку в целевой таблице.

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

person porats    schedule 31.05.2011    source источник


Ответы (1)


Процедурный подход

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;
/
person schurik    schedule 31.05.2011