제32장 DBMS_UTILITY

내용 목차

32.1. 개요
32.2. 타입
32.2.1. UNCL_ARRAY
32.3. 프러시저와 함수
32.3.1. COMMA_TO_TABLE
32.3.2. FORMAT_ERROR_BACKTRACE
32.3.3. FORMAT_ERROR_STACK
32.3.4. GET_TIME

본 장에서는 DBMS_UTILITY 패키지의 기본 개념과 패키지 내의 프러시저와 함수를 사용하는 방법을 설명한다.

32.1. 개요

DBMS_UTILITY은 여러 가지 유용한 기능들을 제공한다.

32.2. 타입

본 절에서는 DBMS_UTILITY 패키지에서 제공하는 별도 정의된 타입들을 알파벳 순으로 설명한다.

32.2.1. UNCL_ARRAY

227자를 최대 길이로 갖는 문자열의 배열이다.

UNCL_ARRAY 타입의 세부 내용은 다음과 같다.

  • 프로토타입

    TYPE uncl_array IS TABLE OF VARCHAR2(227) INDEX BY BINARY_INTEGER;

32.3. 프러시저와 함수

본 절에서는 DBMS_UTILITY 패키지에서 제공하는 프러시저와 함수를 알파벳 순으로 설명한다.

32.3.1. COMMA_TO_TABLE

테이블 이름들이 쉼표로 구분되어 나열된 문자열을 분석하여 테이블 이름들을 구성 요소로 하는 인덱스 테이블로 변환하는 프러시저이다.

COMMA_TO_TABLE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_UTILITY.COMMA_TO_TABLE
    (
        list             IN              VARCHAR2,
        tablen           OUT             BINARY_INTEGER,
        tab              OUT             UNCL_ARRAY
    );
  • 파라미터

    파라미터설명
    list

    쉼표(,)로 구분되어 있는 테이블 이름들의 목록 문자열이다.

    테이블 이름들은 a [. b [. c]][ @ d ]이다. (a, b, c, d는 따옴표로 묶이거나 묶이지 않은 식별자 형태의 문자열)

    tablen생성되는 이름들의 개수이다.
    tab테이블 이름들을 구성 요소로 갖는 인덱스 테이블이다.
  • 예제

    declare
        tab_len binary_integer;
        tab dbms_utility.uncl_array;
    begin
        DBMS_UTILITY.COMMA_TO_TABLE('a,"b".c,d.e.f,g.h@i', tab_len, tab);
    
        for i in 1..tab_len loop
            dbms_output.put_line(tab(i));
        end loop;
    end;
    /

32.3.2. FORMAT_ERROR_BACKTRACE

BACKTRACE 에러 메시지 문자열을 반환하는 함수이다. 반환 문자열이 712bytes를 초과하는 경우 원하는 결과를 얻지 못할 수 있다.

FORMAT_ERROR_BACKTRACE 함수의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 
    RETURN VARCHAR2;
  • 예제

    CREATE OR REPLACE PROCEDURE BACKTRACE_EXAMPLE_PR0
    IS
        variable positive;
    BEGIN
        variable := -1;
    END;
    /
    
    CREATE OR REPLACE PROCEDURE BACKTRACE_EXAMPLE_PR1 IS
    BEGIN
      BACKTRACE_EXAMPLE_PR0 ();
    END;
    /
    
    CREATE OR REPLACE PROCEDURE BACKTRACE_EXAMPLE_PR2 IS
    BEGIN
      BACKTRACE_EXAMPLE_PR1 ();
    END;
    /
    
    CREATE OR REPLACE PROCEDURE BACKTRACE_EXAMPLE_PR3 IS
    BEGIN
      BACKTRACE_EXAMPLE_PR2 ();
    END;
    /
    
    CREATE OR REPLACE PROCEDURE BACKTRACE_EXAMPLE_PR4 IS
      BEGIN BACKTRACE_EXAMPLE_PR3 ();
    END;
    /
    
    CREATE OR REPLACE PROCEDURE BACKTRACE_EXAMPLE_PR5 IS
      BEGIN BACKTRACE_EXAMPLE_PR4 ();
    END;
    /
    
    CREATE OR REPLACE PROCEDURE BACKTRACE_EXAMPLE_PR6 IS
    BEGIN
      BACKTRACE_EXAMPLE_PR5 ();
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE (DBMS_UTILITY.FORMAT_ERROR_BACKTRACE() );
    END;
    /
    
    begin
        BACKTRACE_EXAMPLE_PR6 ();
    end;
    /
    
    -- TBR-15163: Unhandled exception at SYS.BACKTRACE_EXAMPLE_PR0,  line 5.   
    -- TBR-15163: Unhandled exception at SYS.BACKTRACE_EXAMPLE_PR1,  line 3.   
    -- TBR-15163: Unhandled exception at SYS.BACKTRACE_EXAMPLE_PR2,  line 3.   
    -- TBR-15163: Unhandled exception at SYS.BACKTRACE_EXAMPLE_PR3,  line 3.   
    -- TBR-15163: Unhandled exception at SYS.BACKTRACE_EXAMPLE_PR4,  line 2.   
    -- TBR-15163: Unhandled exception at SYS.BACKTRACE_EXAMPLE_PR5,  line 2.   
    -- TBR-15163: Unhandled exception at SYS.BACKTRACE_EXAMPLE_PR6,  line 3.   

32.3.3. FORMAT_ERROR_STACK

에러 스택의 내용을 문자열로 반환하는 함수이다. 반환 문자열이 712bytes를 초과하는 경우 원하는 결과를 얻지 못할 수 있다.

FORMAT_ERROR_STACK 함수의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_UTILITY.FORMAT_ERROR_STACK 
    RETURN VARCHAR2;
  • 예제

    CREATE OR REPLACE PROCEDURE CALLSTACK_EXAMPLE_PR0
    IS
        variable positive;
    BEGIN
        variable := -1;
    END;
    /
    
    CREATE OR REPLACE PROCEDURE CALLSTACK_EXAMPLE_PR1 IS
    BEGIN
      CALLSTACK_EXAMPLE_PR0 ();
    END;
    /
    
    CREATE OR REPLACE PROCEDURE CALLSTACK_EXAMPLE_PR2 IS
    BEGIN
      CALLSTACK_EXAMPLE_PR1 ();
    END;
    /
    
    begin
        CALLSTACK_EXAMPLE_PR2 ();
    exception when others then
        dbms_output.put_line (DBMS_UTILITY.FORMAT_ERROR_STACK);
    
        dbms_output.put_line ('exception handled.');
    end;
    /
    
    --TBR-15035: Number is out of range.   
    --exception handled.  

32.3.4. GET_TIME

현재 시간을 1/100초 단위의 숫자로 표현하는 함수이다. 일반적으로 시작과 끝에 호출하여 소요 시간을 측정하는 데 사용된다.

GET_TIME 함수의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_UTILITY.GET_TIME
    RETURN NUMBER;
  • 예제

    declare
        s number;
        e number;
        c sys_refcursor;
    begin
        s := DBMS_UTILITY.GET_TIME;
        open c for select * from all_objects;
        close c;
        e := DBMS_UTILITY.GET_TIME;
    
        dbms_output.put_line(e - s);
    end;
    /