결과를 보니 총 1,080,000번 루프를 돌았고 소요 시간은 대략 7초다. 이번에는 BULK COLLECT절을 사용해 보자. BULK COLLECT 절을 사용하려면 사번을 vn_emp_id란 일반 변수가 아닌 컬렉션 변수에 담아야 한다.
입력
-- BULK COLLECT
DECLARE
-- 커서 선언
CURSOR c1 IS
SELECT employee_id
FROM emp_bulk;
-- 컬렉션 타입 선언
TYPE bkEmpTP IS TABLE OF emp_bulk.employee_id%TYPE;
-- bkEmpTP형 변수 선언
vnt_bkEmpTP bkEmpTP;
vd_sysdate DATE;
vn_total_time NUMBER := 0;
BEGIN
-- 시작 전 vd_sysdate에 현재시간 설정
vd_sysdate := SYSDATE;
OPEN c1;
-- 루프를 돌리지 않는다
FETCH c1 BULK COLLECT INTO vnt_bkEmpTP;
CLOSE c1;
-- 총 소요 시간 계산(초로 계산하기 위해 60 * 60 * 24을 곱함)
vn_total_time := (SYSDATE - vd_sysdate) * 60 * 60 * 24;
-- 컬렉션변수인 vnt_bkEmpTP 요소 개수 출력
DBMS_OUTPUT.PUT_LINE('전체건수 : ' || vnt_bkEmpTP.COUNT);
-- 총 소요 시간 출력
DBMS_OUTPUT.PUT_LINE('소요시간 : ' || vn_total_time);
END;
결과
전체건수 : 1080000
소요 시간 : .9999999999999999999999999999999999999984
루프를 도는 대신 컬렉션 변수 vnt_bkEmpTP에 값을 할당해서 처리했더니 대략 0.9초가 걸렸다. 일반 커서로 루프를 돌린 것과 비교하면, 같은 결과를 얻는 동시에 수행시간이 극적으로 단축되었다.
BULK COLLECT 절은 FETCH문 뿐만 아니라 SELECT INTO 절에도 사용할 수 있는데, 이때 반환되는 데이터는 일반 변수가 아닌 컬렉션 변수에 담아야 한다.