더북(TheBook)

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

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