0

重複の可能性:
ストアド プロシージャを作成せずに、Oracle で複数の行を 1 つに連結するにはどうすればよいですか?

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 文字は同じままですが、最後の 2 文字は記録)

したがって、このテーブルのデータを、次の仕様を持つ新しいテーブルに入れる必要があります

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

したがって、基本的には、ソース テーブルから同じ人物に属する行を連結し、それをターゲット テーブルの 1 つの行に配置する必要があります。

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

1 に答える 1

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;
/
于 2011-05-31T10:50:31.570 に答える