この記事は約4分18秒で読むことができます。

sourceテーブルからオブジェクト型でデータ取得し、bulk collectでcollection変換したあとtable()かましてtargetテーブルに登録した話

移行元と移行先テーブル作る

クエリ

コード表示

drop table tbl___src___ purge;
create table tbl___src___ as select level as rn, chr(level+64) as str from dual connect by level <= 3;
drop table tbl___tar___ purge;
create table tbl___tar___ as select * from tbl___src___ where 1 <> 1;

オブジェクト型とコレクション型作る

クエリ

コード表示

create or replace type item is object (rn number,str varchar2(10));
/
create or replace type liz is table of item;
/

select item(rn,str) from tbl___src___;
select cast(collect(item(rn,str)) as liz) from tbl___src___;

表題のプロシージャ

クエリ

コード表示

set serveroutput on;

create or replace procedure proc___liz___ as
	cnt number;
	lz liz;
	cursor csr is select item(rn,str) from tbl___src___;
begin
	open csr;
	loop
		begin
			fetch csr bulk collect into lz;
			exit when csr%notfound;
		end;
	end loop;
	dbms_output.put_line('ele_cnt:' || lz.count);
	dbms_output.put_line('ele_fst:' || lz.first);
	dbms_output.put_line('ele_lst:' || lz.last);
	dbms_output.put_line('________________________________________');
	for i in lz.first..lz.last loop
		dbms_output.put_line('rn:' || lz(i).rn || ',str:' || lz(i).str);
	end loop;
	close csr;
	insert into tbl___tar___ select * from table(lz);
	commit;
end;
/

移行されたことを確認

クエリ

コード表示

select * from tbl___tar___;
exec proc___liz___;

Leave a Reply

Your email address will not be published. Required fields are marked *