결과를 보니 총 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 절에도 사용할 수 있는데, 이때 반환되는 데이터는 일반 변수가 아닌 컬렉션 변수에 담아야 한다.

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.