또 다른 계산 방법이 있다. SQL문의 실행 전과 후의 시간 차이를 계산한다는 점은 같지만 이번에는 DBMS_UTILITY.GET_TIME이란 함수를 사용해 볼 것이다. 이 함수는 현재시간을 가져와 반환하는데, 반환 타입은 숫자형으로 단위는 1/100초다. 따라서 이 함수를 사용해 초를 구하려면 100으로 나눠야 한다. ch17_src_test_pkg.sales_detail_prc의 소요 시간 계산 부분을 DBMS_UTILITY.GET_TIME으로 대체해 보자.

    입력

        CREATE OR REPLACE PACKAGE BODY ch17_src_test_pkg IS
    
          PROCEDURE sales_detail_prc ( ps_month IN VARCHAR2,
                                       pn_amt   IN NUMBER,
                                       pn_rate  IN NUMBER   )
        IS
          vn_total_time NUMBER := 0;  -- 소요 시간 계산용 변수
        BEGIN
          DBMS_OUTPUT.PUT_LINE('--------------<변수값 출력>---------------------');
          DBMS_OUTPUT.PUT_LINE('ps_month : ' || ps_month);
          DBMS_OUTPUT.PUT_LINE('pn_amt   : ' || pn_amt);
          DBMS_OUTPUT.PUT_LINE('pn_rate  : ' || pn_rate);
          DBMS_OUTPUT.PUT_LINE('------------------------------------------------');
    
          --1. p_month에 해당하는 월의 CH17_SALES_DETAIL 데이터 삭제
          -- delete 전 시간 가져오기(SYSDATE가 아닌 vn_total_time 변수에 값을 할당한다)
          vn_total_time := DBMS_UTILITY.GET_TIME;
    
          DELETE ch17_SALES_DETAIL
           WHERE sales_month = ps_month;
    
          -- DELETE 소요 시간 계산(초로 계산하기 위해 100으로 나눈다)
          vn_total_time := (DBMS_UTILITY.GET_TIME - vn_total_time) / 100;
          DBMS_OUTPUT.PUT_LINE('DELETE 건수 : ' || SQL%ROWCOUNT || ' , 소요시간: ' || vn_total_time );
    
          --2. p_month에 해당하는 월의 CH17_SALES_DETAIL 데이터 생성
          vn_total_time := DBMS_UTILITY.GET_TIME;
    
          INSERT INTO ch17_SALES_DETAIL
          SELECT b.prod_name,
                 d.channel_desc,
                 c.cust_name,
                 e.emp_name,
                 a.sales_date,
                 a.sales_month,
                 sum(a.quantity_sold),
                 sum(a.amount_sold)
            FROM sales a,
                 products b,
                 customers c,
                 channels d,
                 employees e
           WHERE a.sales_month = ps_month
             AND a.prod_id     = b.prod_id
             AND a.cust_id     = c.cust_id
             AND a.channel_id  = d.channel_id
             AND a.employee_id = e.employee_id
           GROUP BY b.prod_name,
                    d.channel_desc,
                    c.cust_name,
                    e.emp_name,
                    a.sales_date,
                    a.sales_month;
    
          -- INSERT 소요 시간 계산(초로 계산하기 위해 100으로 나눈다)
          vn_total_time := (DBMS_UTILITY.GET_TIME - vn_total_time)  / 100;
          DBMS_OUTPUT.PUT_LINE('INSERT 건수 : ' || SQL%ROWCOUNT || ' , 소요시간: ' || vn_total_time );
    
    
          -- 3. 판매금액(sales_amt)이 pn_amt보다 큰 건은 pn_rate 비율만큼 할인
          vn_total_time := DBMS_UTILITY.GET_TIME;
    
          UPDATE ch17_SALES_DETAIL
             SET sales_amt = sales_amt - ( sales_amt * pn_rate * 0.01)
           WHERE sales_month = ps_month
             AND sales_amt   > pn_amt;
    
          -- UPDATE 소요 시간 계산(초로 계산하기 위해 100으로 나눈다)
          vn_total_time := (DBMS_UTILITY.GET_TIME - vn_total_time)  / 100;
          DBMS_OUTPUT.PUT_LINE('UPDATE 건수 : ' || SQL%ROWCOUNT || ' , 소요시간: ' || vn_total_time );
    
          COMMIT;
          EXCEPTION WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE(SQLERRM);
            ROLLBACK;
          END sales_detail_prc;
        END ch17_src_test_pkg;
    

    결과

        PACKAGE BODY CH17_SRC_TEST_PKG이(가) 컴파일되었습니다.
    

    이전에는 문장 실행 전 vd_sysdate에 SYSDATE을 할당했지만 이번에는 vn_total_time이란 NUMBER형 변수에 DBMS_UTILITY.GET_TIME 함수의 반환 값을 할당한 점이 달라졌다. 프로시저를 실행해 보자.

    입력

        BEGIN
          ch17_src_test_pkg.sales_detail_prc ( ps_month => '200112',
                                               pn_amt   => 50,
                                               pn_rate  => 32.5 );
        END;
    

    결과

        --------------<변수값 출력>---------------------
        ps_month : 200112
        pn_amt : 50
        pn_rate : 32.5
        ------------------------------------------------
        DELETE 건수 : 22698 , 소요 시간: .3
        INSERT 건수 : 22698 , 소요 시간: .19
        UPDATE 건수 : 7643 , 소요 시간: .08
    

    이전 결과에 비해 출력된 시간의 정밀도가 좀더 높은데, 이는 DBMS_UTILITY.GET_TIME 함수의 반환값이 1/100 초 단위이기 때문이다. DBMS_UTILITY.GET_TIME을 사용하는 것이 훨씬 더 코드가 깔끔하고 사용법도 간편하니 소요 시간을 계산할 때는 적극 활용하길 바란다.

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