제44장 UTL_TCP

내용 목차

44.1. 개요
44.2. 타입
44.2.1. CONNECTION
44.3. 프러시저와 함수
44.3.1. CLOSE_CONNECTION
44.3.2. GET_LINE
44.3.3. GET_RAW
44.3.4. GET_TEXT
44.3.5. OPEN_CONNECTION
44.3.6. READ_LINE
44.3.7. READ_RAW
44.3.8. READ_TEXT
44.3.9. WRITE_LINE
44.3.10. WRITE_RAW
44.3.11. WRITE_TEXT

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

44.1. 개요

UTL_TCP은 TCP/IP 클라이언트 역할을 수행할 수 있는 프러시저 및 함수들을 제공하는 패키지이다.

많은 인터넷 환경이 TCP/IP 프로토콜에 기반하므로, 이메일이나 인터넷 연결 등에 유용하게 사용될 수 있다.

44.2. 타입

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

44.2.1. CONNECTION

UTL_TCP를 이용한 TCP/IP 연결의 객체 및 연결 정보를 담고 있는 레코드 타입이다.

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

  • 프로토타입

    TYPE CONNECTION IS RECORD 
    (
        pvid            PLS_INTEGER,    
        remote_host     VARCHAR2(255),  
        remote_port     PLS_INTEGER,    
        tx_timeout      PLS_INTEGER     
    );
  • 필드

    필드 이름설명
    pvidTCP/IP의 연결 객체를 지칭하는 ID이다. 변경하지 않도록 한다.
    remote_host연결된 TCP 서버의 주소이다.
    remote_port연결된 TCP 서버의 포트 번호이다.
    tx_timeout

    TCP 통신을 이용한 읽기/쓰기의 시간 제한으로, 제한 시간이 지나면 타임아웃 에러와 함께 반환한다. (단위: 초)

    • NULL: 응답이 올 때까지 기다린다.

    • 0: 전송 후 대기 없이 즉시 빠져나온다.

44.3. 프러시저와 함수

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

44.3.1. CLOSE_CONNECTION

연결 중인 TCP/IP 연결을 끊는 프러시저이다.

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

  • 프로토타입

    UTL_TCP.CLOSE_CONNECTION 
    (
        c IN OUT NOCOPY connection
    );
  • 파라미터

    파라미터설명
    c기존에 연결된 연결 객체이다. 타입은 UTL_TCP.CONNECTION이다.
  • 예제

    DECLARE
        c UTL_TCP.CONNECTION;
    BEGIN
        c := UTL_TCP.OPEN_CONNECTION('localhost', 25);
        UTL_TCP.CLOSE_CONNECTION(c);
    END;

44.3.2. GET_LINE

원격 TCP 서버로부터 받은 문자열 한 줄을 가져오는 함수이다. 자세한 내용은 동일한 기능을 수행하는 READ_LINE 함수의 설명을 참고한다.

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

  • 프로토타입

    UTL_TCP.GET_LINE 
    (
        c               IN OUT NOCOPY   connection,
        remove_crlf     IN              BOOLEAN     DEFAULT FALSE,
        peek            IN              BOOLEAN     DEFAULT FALSE
    ) 
    RETURN VARCHAR2;
  • 파라미터

    파라미터설명
    c기존에 연결된 연결 객체이다. 타입은 UTL_TCP.CONNECTION이다.
    remove_crlfTRUE일 경우 문자열에 포함된 CR/LF 문자열을 제거하여 반환한다.
    peekTRUE일 경우 TCP input queue로부터 읽어온 데이터를 비우지 않고 보존하여 이후 다시 읽어올 경우 같은 데이터를 읽게 된다.
  • 반환값

    읽어들인 문자열이다.

  • 예제

    DECLARE
        c UTL_TCP.CONNECTION;
        data VARCHAR2(100);
    BEGIN
        c := UTL_TCP.OPEN_CONNECTION('localhost', 80);
        data := UTL_TCP.GET_LINE(c); 
    END;

44.3.3. GET_RAW

원격 TCP 서버로부터 받은 바이너리 데이터를 가져오는 함수이다. 자세한 내용은 동일한 기능을 수행하는 READ_RAW 함수의 설명을 참고한다.

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

  • 프로토타입

    UTL_TCP.GET_RAW 
    (
        c       IN OUT NOCOPY   connection,
        len     IN              PLS_INTEGER DEFAULT 1,
        peek    IN              BOOLEAN     DEFAULT FALSE
    ) 
    RETURN RAW;
  • 파라미터

    파라미터설명
    c기존에 연결된 연결 객체이다. 타입은 UTL_TCP.CONNECTION이다.
    len읽어올 바이너리 데이터의 Byte 개수이다. (기본값: 1)
    peekTRUE일 경우 TCP input queue로부터 읽어온 데이터를 비우지 않고 보존하여 이후 다시 읽어올 경우 같은 데이터를 읽게 된다.
  • 반환값

    읽어들인 바이너리 데이터이다.

  • 예제

    DECLARE
        c UTL_TCP.CONNECTION;
        data RAW(100);
    BEGIN
        c := UTL_TCP.OPEN_CONNECTION('localhost', 80);
        data := UTL_TCP.GET_RAW(c, 10);  -- 10Byte의 문자열을 읽어올 것을 요청
    END;

44.3.4. GET_TEXT

원격 TCP 서버로부터 받은 문자열을 가져오는 함수이다. 자세한 내용은 동일한 기능을 수행하는 READ_TEXT 함수의 설명을 참고한다.

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

  • 프로토타입

    UTL_TCP.GET_TEXT 
    (
        c      IN OUT NOCOPY   connection,
        len    IN              PLS_INTEGER DEFAULT 1,
        peek   IN              BOOLEAN     DEFAULT FALSE
    ) 
    RETURN VARCHAR2
  • 파라미터

    파라미터설명
    c기존에 연결된 연결 객체이다. 타입은 UTL_TCP.CONNECTION이다.
    len읽어올 문자열의 Byte 개수이다. (기본값: 1)
    peekTRUE일 경우 TCP input queue로부터 읽어온 데이터를 비우지 않고 보존하여 이후 다시 읽어올 경우 같은 데이터를 읽게 된다.
  • 반환값

    읽어들인 문자열이다.

  • 예제

    DECLARE
        c UTL_TCP.CONNECTION;
        data VARCHAR2(100);
    BEGIN
        c := UTL_TCP.OPEN_CONNECTION('localhost', 80);
        data := UTL_TCP.GET_TEXT(c, 10);  -- 10Byte의 문자열을 읽어올 것을 요청
    END;

44.3.5. OPEN_CONNECTION

외부 TCP 서버로의 TCP/IP 연결을 맺는 프러시저이다.

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

  • 프로토타입

    UTL_TCP.OPEN_CONNECTION 
    (
        remote_host     IN  VARCHAR2,                     
        remote_port     IN  PLS_INTEGER,                  
        tx_timeout      IN  PLS_INTEGER DEFAULT NULL
    ) 
    RETURN UTL_TCP.CONNECTION;
  • 파라미터

    파라미터설명
    remote_host연결할 TCP 서버의 주소 이름이다. NULL이면 localhost로 자동 설정된다.
    remote_port연결할 TCP 서버의 포트 번호이다.
    tx_timeout

    TCP 통신을 이용한 읽기/쓰기의 시간 제한으로, 제한 시간이 지나면 타임아웃 에러와 함께 반환한다. (단위: 초)

    • NULL: 응답이 올 때까지 기다린다.

    • 0: 전송 후 대기 없이 즉시 빠져나온다.

  • 반환값

    TCP/IP 연결 정보를 갖는 UTL_TCP.CONNECTION 타입의 객체이다.

  • 예제

    DECLARE
        c UTL_TCP.CONNECTION;
    BEGIN
        c := UTL_TCP.OPEN_CONNECTION('localhost', 25);
    END;

44.3.6. READ_LINE

원격 TCP 서버로부터 받은 문자열 한 줄을 가져오는 함수이다.

타임아웃이 설정된 경우 타임아웃 시간까지 기다렸다가 만료되었을 때 TRANSFER_TIMEOUT 예외를 발생시킨다. 타임아웃이 NULL일 경우에는 무한정 기다리므로 주의하여 사용하도록 한다.

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

  • 프로토타입

    UTL_TCP.READ_LINE 
    (
        c               IN OUT NOCOPY   connection,
        data            IN OUT NOCOPY   VARCHAR2,
        remove_crlf     IN              BOOLEAN     DEFAULT FALSE,
        peek            IN              BOOLEAN     DEFAULT FALSE
    ) 
    RETURN PLS_INTEGER;
  • 파라미터

    파라미터설명
    c기존에 연결된 연결 객체이다. 타입은 UTL_TCP.CONNECTION이다.
    data읽어들인 문자열이다.
    remove_crlfTRUE일 경우 문자열에 포함된 CR/LF 문자열을 제거하여 반환한다.
    peekTRUE일 경우 TCP input queue로부터 읽어온 데이터를 비우지 않고 보존하여 이후 다시 읽어올 경우 같은 데이터를 읽게 된다.
  • 반환값

    읽어들인 문자열의 문자 개수이다.

  • 예제

    DECLARE
        c UTL_TCP.CONNECTION;
        data VARCHAR2(100);
        len PLS_INTEGER;
    BEGIN
        c := UTL_TCP.OPEN_CONNECTION('localhost', 80);
        len := UTL_TCP.READ_LINE(c, data); 
    END;

44.3.7. READ_RAW

원격 TCP 서버로부터 받은 바이너리 데이터를 가져오는 함수이다.

타임아웃이 설정된 경우 타임아웃 시간까지 기다렸다가 만료되었을 때 TRANSFER_TIMEOUT 예외를 발생시킨다. 타임아웃이 NULL일 경우에는 무한정 기다리므로 주의하여 사용하도록 한다.

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

  • 프로토타입

    UTL_TCP.READ_RAW 
    (
        c      IN OUT NOCOPY   connection,
        data   IN OUT NOCOPY   RAW,
        len    IN              PLS_INTEGER DEFAULT 1,
        peek   IN              BOOLEAN     DEFAULT FALSE
    ) 
    RETURN PLS_INTEGER;
  • 파라미터

    파라미터설명
    c기존에 연결된 연결 객체이다. 타입은 UTL_TCP.CONNECTION이다.
    data읽어들인 문자열이다.
    len읽어올 바이너리 데이터의 Byte 개수이다.
    peekTRUE일 경우 TCP input queue로부터 읽어온 데이터를 비우지 않고 보존하여 이후 다시 읽어올 경우 같은 데이터를 읽게 된다.
  • 반환값

    읽어들인 데이터의 Byte 개수이다.

  • 예제

    DECLARE
        c UTL_TCP.CONNECTION;
        data RAW(100);
        len PLS_INTEGER;
    BEGIN
        c := UTL_TCP.OPEN_CONNECTION('localhost', 80);
        len := UTL_TCP.READ_RAW(c, data, 10); 
    END;

44.3.8. READ_TEXT

원격 TCP 서버로부터 받은 문자열을 가져오는 함수이다.

타임아웃이 설정된 경우 타임아웃 시간까지 기다렸다가 만료되었을 때 TRANSFER_TIMEOUT 예외를 발생시킨다. 타임아웃이 NULL일 경우에는 무한정 기다리므로 주의하여 사용하도록 한다.

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

  • 프로토타입

    UTL_TCP.READ_TEXT 
    (
        c     IN OUT NOCOPY   connection,
        data  IN OUT NOCOPY   VARCHAR2,
        len   IN              PLS_INTEGER DEFAULT 1,
        peek  IN              BOOLEAN     DEFAULT FALSE
    ) 
    RETURN PLS_INTEGER;
  • 파라미터

    파라미터설명
    c기존에 연결된 연결 객체이다. 타입은 UTL_TCP.CONNECTION이다.
    data읽어들인 문자열이다.
    len읽어올 문자열의 문자 개수이다.
    peekTRUE일 경우 TCP input queue로부터 읽어온 데이터를 비우지 않고 보존하여 이후 다시 읽어올 경우 같은 데이터를 읽게 된다.
  • 반환값

    읽어들인 데이터의 Byte 개수이다.

  • 예제

    DECLARE
        c UTL_TCP.CONNECTION;
        data VARCHAR2(100);
        len PLS_INTEGER;
    BEGIN
        c := UTL_TCP.OPEN_CONNECTION('localhost', 80);
        len := UTL_TCP.READ_TEXT(c, data, 10); 
    END;

44.3.9. WRITE_LINE

원격 TCP 서버로 한줄의 문자열을 전송하는 함수이다. 입력문자열 뒤에 새줄 문자열이 붙어서 전송된다.

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

  • 프로토타입

    UTL_TCP.WRITE_LINE 
    (
        c    IN OUT NOCOPY   connection,                       
        data IN              VARCHAR2    DEFAULT NULL
    ) 
    RETURN PLS_INTEGER;
  • 파라미터

    파라미터설명
    c기존에 연결된 연결 객체이다. 타입은 UTL_TCP.CONNECTION이다.
    data전송할 문자열이다.
  • 반환값

    실제 전송된 데이터의 문자열 개수이다.

  • 예제

    DECLARE
        c UTL_TCP.CONNECTION;
        rc INTEGER;
    BEGIN
        c := UTL_TCP.OPEN_CONNECTION('localhost', 80);
        rc := UTL_TCP.WRITE_LINE(c, 'GET / HTTP/1.0');
    END;

44.3.10. WRITE_RAW

원격 TCP 서버로 바이너리 형태의 데이터를 보내는 함수이다.

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

  • 프로토타입

    UTL_TCP.WRITE_RAW 
    (
        c     IN OUT NOCOPY   connection,                       
        data  IN              RAW,                              
        len   IN              PLS_INTEGER DEFAULT NULL
    ) 
    RETURN PLS_INTEGER;
  • 파라미터

    파라미터설명
    c기존에 연결된 연결 객체이다. 타입은 UTL_TCP.CONNECTION이다.
    data전송할 바이너리 데이터이다.
    len전송할 바이너리 데이터의 Byte 수이다. NULL이면 데이터 전체를 전송한다.
  • 반환값

    실제 전송된 데이터의 Byte 수이다.

  • 예제

    DECLARE
        c UTL_TCP.CONNECTION;
        rc INTEGER;
    BEGIN
        c := UTL_TCP.OPEN_CONNECTION('localhost', 80);
        rc := UTL_TCP.WRITE_RAW(c, '0D0A'); -- 0d 0a의 hex값을 가진 바이너리 데이터 전송
    END;

44.3.11. WRITE_TEXT

원격 TCP 서버로 문자열 형태의 데이터를 보내는 함수이다.

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

  • 프로토타입

    UTL_TCP.WRITE_TEXT 
    (
        c    IN OUT NOCOPY   connection,                       
        data IN              VARCHAR2,                         
        len  IN              PLS_INTEGER DEFAULT NULL
    ) 
    RETURN PLS_INTEGER;
  • 파라미터

    파라미터설명
    c기존에 연결된 연결 객체이다. 타입은 UTL_TCP.CONNECTION이다.
    data전송할 문자열 데이터이다.
    len전송할 문자열의 문자 개수이다. NULL이면 문자열 전체를 전송한다.
  • 반환값

    실제 전송된 문자열의 문자 개수이다.

  • 예제

    DECLARE
        c UTL_TCP.CONNECTION;
        rc INTEGER;
    BEGIN
        c := UTL_TCP.OPEN_CONNECTION('localhost', 8080);
        rc := UTL_TCP.WRITE_TEXT(c, 'TIBEROTMAX', 6); -- TIBEROTMAX 문자열 중 
                                                         TIBERO 문자열만 전송한다.
    END;