제22장 DBMS_OUTPUT

내용 목차

22.1. 개요
22.2. 프러시저
22.2.1. DISABLE
22.2.2. ENABLE
22.2.3. GET_LINE, GET_LINES
22.2.4. NEW_LINE
22.2.5. PUT, PUT_LINE

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

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)

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

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

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>