--SQL수행예제
declare
cursor c is select * from source;
type typ_source is table of c%rowtype;
l_source typ_source;
l_array_size number default 10000;
procedure insert_target(p_source in typ_source) is
begin
forall i in p_source.first..p_source.last
insert into target values p_source(i);
end insert_target;
begin
open c;
loop
fetch c bulk collect into l_source limit l_array_size;
insert_target(l_source);
exit when c%notfound;
end loop;
close c;
commit;
end;
-자바는 PreparedStatement의 addBatch, executeBatch를 활용해 수행가능
- 한줄요약 : 대량 입출력시 nologging, 인덱스해제, pk해재후 입력한다음 생성하면 성능향상효과가있다
-- 인덱스가 Unusable상태에서 데이터 입력하려면
-- 기본값이 true
alter session set skip_unusable_indexes = true;
update 고객 c
set 최종거래일시 = (select max(거래일시) from 거래
where 고객번호 = c.고객번호
and 거래일시 >= trunc(add_months(sysdate,-1)))
, 최근거래횟수 = (select count(*) from 거래
where 고객번호 = c.고객번호
and 거래일시 >= trunc(add_months(sysdate,-1)))
, 최근거래금액 = (select sum(거래금액) from 거래
where 고객번호 = c.고객번호
and 거래일시 >= trunc(add_months(sysdate,-1)))
where exists (select 'x' from 거래
where 고객번호 = c.고객번호
and and 거래일시 >= trunc(add_months(sysdate,-1)))
update 고객 c
set (최종거래일시, 최근거래횟수, 최근거래금액) =
(select max(거래일시), count(*), sum(거래금액)
from 거래
where 고객번호 = c.고객번호
and 거래일시 >= trunc(add_months(sysdate, -1)))
where exists (select 'x' from 거래
where 고객번호 = c.고객번호
and 거래일시 >= trunc(add_months(sysdate, -1)))
update 고객 c
set (최종거래일시, 최근거래횟수, 최근거래금액) =
(select max(거래일시), count(*), sum(거래금액)
from 거래
where 고객번호 = c.고객번호
and 거래일시 >= trunc(add_months(sysdate, -1)))
where exists (select /*+ unnest hash_sj*/'x' from 거래
where 고객번호 = c.고객번호
and 거래일시 >= trunc(add_months(sysdate, -1)))
update 고객 c
set (최종거래일시, 최근거래횟수, 최근거래금액) =
(select nvl(max(거래일시), c.최종거래일시)
,decode(count(*), 0, c.최근거래횟수, count(*))
,nvl(sum(거래금액), c.최근거래금액)
from 거래
where 고객번호 = c.고객번호
and 거래일시 >= trunc(add_months(sysdate, -1)))