제17장 DBMS_OUTPUT

내용 목차

17.1. 개요
17.2. 프러시저
17.2.1. DISABLE
17.2.2. ENABLE
17.2.3. GET_LINE, GET_LINES
17.2.4. NEW_LINE
17.2.5. PUT, PUT_LINE

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

17.1. 개요

DBMS_OUTPUT은 메시지를 버퍼에 저장하고 버퍼로부터 메시지를 읽어오기 위한 인터페이스를 제공하는 패키지이다. 하나의 프러시저, 함수, 트리거 등에 의해 저장된 메시지는 다른 프러시저, 함수, 트리거 등에서 읽어올 수 있다.

DBMS_OUTPUT 패키지 내의 ENABLE 프러시저를 실행하여 메시지를 주고받기 위한 버퍼를 지정된 크기로 할당한다. 만약 메시지를 지정된 버퍼 크기 이상으로 저장하려고 하면 예외 상황이 발생한다.

할당된 버퍼는 DISABLE 프러시저를 실행하여 제거할 수 있으며, 다시 ENABLE 프러시저를 실행하기 전에는 GET_LINE 및 GET_LINES 또는 PUT 및 PUT_LINE, NEW_LINE 프러시저를 호출해도 무시된다. 버퍼 내의 메시지는 여러 라인으로 구성되어 있으며, 라인마다 라인 끝(End of Line, 이하 EOL) 문자로 끝난다.

PUT_LINE 프러시저를 통해 버퍼에 저장된 메시지는 GET_LINE이나 GET_LINES 프러시저를 실행하여 읽어올 수 있다.

다음은 DBMS_OUTPUT 패키지 내에 정의된 타입이다.

  • CHARARR

    메시지 버퍼에서 읽어온 내용을 저장하기 위한 공간이다.

    TYPE CHARARR IS TABLE OF VARCHAR2(32767)

17.2. 프러시저

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

17.2.1. DISABLE

할당된 메시지 버퍼를 제거하고, DBMS_OUTPUT 패키지 내의 다른 프러시저를 사용할 수 없게 하는 프러시저이다. 이 프로서지를 실행하면 메시지 버퍼에 남아있는 모든 메시지가 함께 제거된다.

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

  • 프로토타입

    DBMS_OUTPUT.DISABLE;
  • 예제

    BEGIN
        DBMS_OUTPUT.PUT_LINE('Before DISABLE');
        DBMS_OUTPUT.DISABLE;
        DBMS_OUTPUT.PUT_LINE('After DISABLE');
    END;
    /
    
    PSM completed
    SQL> 

17.2.2. ENABLE

지정된 크기의 메시지 버퍼를 할당하고 DBMS_OUTPUT 패키지 내의 다른 프러시저를 사용할 수 있게 하는 프러시저이다. 이 프러시저를 여러 번 호출하면 가장 크게 지정한 크기로 메시지 버퍼를 할당한다. 이때 메시지 버퍼의 크기는 최소 2KB, 최대 1MB이다.

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

  • 프로토타입

    DBMS_OUTPUT.ENABLE 
    (
        buffer_size     IN          INTEGER     DEFAULT 20000
    );
  • 파라미터

    파라미터설명
    buffer_size할당할 메시지 버퍼의 크기이다. (단위: Byte)
  • 예제

    BEGIN
        DBMS_OUTPUT.DISABLE;
        DBMS_OUTPUT.PUT_LINE('Before ENABLE');
        DBMS_OUTPUT.ENABLE(32768);
        DBMS_OUTPUT.PUT_LINE('After ENABLE');
    END;
    /
    After ENABLE
    
    PSM completed
    SQL> 

17.2.3. GET_LINE, GET_LINES

메시지 버퍼로부터 라인 단위로 메시지를 읽어오는 프러시저이다. 이 프러시저는 라인 단위로 메시지를 읽으며, 하나의 라인을 형성하지 않은 메시지는 읽지 않는다.

GET_LINE 또는 GET_LINES 프러시저를 호출한 후에 PUT 또는 PUT_LINE 프러시저를 호출하면, 현재까지 메시지 버퍼에 남아 있던 메시지는 모두 제거된다.

한 라인의 메시지는 최대 255bytes의 크기를 가지므로, 출력 파라미터의 크기를 충분하게 설정해야 한다.

GET_LINE, GET_LINES 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    • GET_LINE

      GET_LINE 프러시저는 한 번 호출될 때마다 하나의 라인만을 읽어온다.

      DBMS_OUTPUT.GET_LINE 
      (
          line            OUT         VARCHAR, 
          status          OUT         INTEGER
      );
    • GET_LINES

      GET_LINE 프러시저는 지정된 수만큼, 한 번에 여러 라인의 메시지를 읽어온다. 이때 메시지 버퍼로부터 실제로 읽어온 메시지 라인의 수를 반환한다. 만약 메시지 버퍼 내에 충분한 수의 메시지 라인이 없어서 지정된 수만큼의 메시지 라인을 가져오지 못하면, 가져온 메시지 라인의 수만큼만 저장된다.

      DBMS_OUTPUT.GET_LINES 
      (
          lines           OUT         CHARARR, 
          numlines       IN OUT      INTEGER
      );
  • 파라미터

    파라미터설명
    line, lines메시지 버퍼로부터 읽어 온 한 라인 또는 여러 라인의 메시지이다.
    status
    • 메시지를 성공적으로 읽어 온 경우에는 0을 반환한다.

    • 메시지를 성공적으로 읽어 오지 못한 경우에는 1을 반환한다.

    numlines읽어 올 메시지 라인의 수를 입력하고, 실제로 읽어 온 메시지 라인의 수를 출력한다.
  • 예제

    • GET_LINE

      DECLARE
          message VARCHAR(1024);
          status INTEGER;
      BEGIN
          DBMS_OUTPUT.PUT_LINE('A poet is the painter of the soul');
          DBMS_OUTPUT.PUT_LINE('Faith without deeds is useless');
          DBMS_OUTPUT.PUT_LINE('Forgiveness is better than revenge');
          DBMS_OUTPUT.GET_LINE(message, status);
          DBMS_OUTPUT.PUT_LINE(message);
      END;
      /
      A poet is the painter of the soul
      
      PSM completed
      SQL> 
    • GET_LINES

      DECLARE
          message_arr DBMS_OUTPUT.CHARARR;
          num_lines INTEGER := 4;
      BEGIN
          DBMS_OUTPUT.PUT('A poet is ');
          DBMS_OUTPUT.PUT('the painter of the soul');
          DBMS_OUTPUT.NEW_LINE;
          DBMS_OUTPUT.PUT_LINE('Faith without deeds is useless');
          DBMS_OUTPUT.PUT_LINE('Forgiveness is better than revenge');
          DBMS_OUTPUT.GET_LINES(message_arr, num_lines);
          DBMS_OUTPUT.PUT_LINE(message_arr(2));
      END;
      /
      Faith without deeds is useless
      
      PSM completed
      SQL> 

17.2.4. NEW_LINE

메시지 버퍼에 EOL 문자를 저장하는 프러시저이다.

PUT 프러시저로 메시지를 저장한 경우 EOL 문자가 없으므로 라인 단위로 메시지를 읽는 GET_LINE, GET_LINES 프러시저로 문자열을 읽어 올 수 없다. 단, NEW_LINE 프러시저를 사용하면 GET_LINE, GET_LINES 프러시저로 문자열을 읽어 올 수 있다.

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

  • 프로토타입

    DBMS_OUTPUT.NEW_LINE;
  • 예제

    BEGIN
        DBMS_OUTPUT.PUT_LINE('The will of a man is his happiness');
        DBMS_OUTPUT.NEW_LINE;
        DBMS_OUTPUT.PUT_LINE('Love your neighbor as yourself');
    END;
    /
    The will of a man is his happiness
    
    Love your neighbor as yourself
    
    PSM completed
    SQL> 

17.2.5. PUT, PUT_LINE

메시지 버퍼에 메시지를 저장하는 프러시저이다.

PUT, PUT_LINE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    • PUT

      PUT 프러시저는 하나의 라인을 여러 번에 걸쳐 저장할 수 있다. 버퍼에 저장되는 메시지의 마지막 라인 끝에 EOL 문자가 첨부되지 않는다.

      DBMS_OUTPUT.PUT
      (
          data IN NUMBER
      );
      DBMS_OUTPUT.PUT
      (
         data IN VARCHAR
      );
    • PUT_LINE

      PUT_LINE 프러시저는 PUT 프러시저와는 반대로 버퍼에 저장되는 메시지의 마지막 라인 끝에 EOL 문자를 첨부한다. 만약 EOL 문자만을 저장하려면 NEW_LINE 프러시저를 호출한다.

      DBMS_OUTPUT.PUT_LINE
      (
         data IN NUMBER
      );
      DBMS_OUTPUT.PUT_LINE
      (
         data IN VARCHAR
      );
  • 파라미터

    입력 값으로 주어진 파라미터의 데이터 타입은 NUMBER, VARCHAR, DATE 세 가지이며, 메시지로 저장되기 전에 항상 VARCHAR 타입으로 변환된다. NUMBER와 DATE 타입의 데이터는 TO_CHAR 함수를 적용하여 반환된 결과로 저장된다.

    파라미터설명
    data메시지 버퍼에 저장할 메시지 데이터이다.
  • 예외 상황

    예외 상황설명
    BUF_OVERFLOW메시지 버퍼의 최댓값을 초과한 경우이다.