내용 목차
본 장에서는 DBMS_PIPE 패키지의 기본 개념과 패키지 내의 프러시저와 함수를 사용하는 방법을 설명한다.
DBMS_PIPE은 동일한 인스턴스 내에 속해 있는 세션들 간에 통신할 수 있는 기능을 지원하는 패키지이다. UNIX 계열에서 사용되는 파이프와 유사한 개념이지만 tbPSM RDBMS 내의 자료 구조를 기반으로 운영체제와는 다른 메카니즘으로 구현되어 있다. 동일 인스턴스 내에서의 통신만 가능하므로, TAC 환경에서는 사용할 수 없다.
본 절에서는 DBMS_PIPE 패키지에서 제공하는 프러시저와 함수를 알파벳 순으로 설명한다.
명시적으로 공개 또는 사용자 소유의 통신용 파이프를 생성하는 함수이다.
CREATE_PIPE 함수의 세부 내용은 다음과 같다.
프로토타입
DBMS_PIPE.CREATE_PIPE ( pipename IN VARCHAR2, maxpipesize IN PLS_INTEGER DEFAULT 8192, private IN BOOLEAN DEFAULT TRUE ) RETURN PLS_INTEGER;
파라미터
파라미터 | 설명 |
---|---|
pipename | 생성하는 파이프의 이름으로 인스턴스 내에서 고유한 값이다. SEND_MESSAGE, RECEIVE_MESSAGE를 호출할 때 이 이름을 사용하여 송수신할 수 있다. |
maxpipesize | 메시지들을 파이프에 저장할 수 있는 최대 크기이다. (기본값: 8192Bytes) |
private |
|
반환값
반환값 | 설명 |
---|---|
0 | 파이프 생성이 성공한 경우에 반환한다. |
예제
DECLARE status pls_integer; BEGIN status := DBMS_PIPE.CREATE_PIPE('tbpipe', 1000, false); END;
로컬 메시지 버퍼에 저장되어 있는 다음 아이템의 데이터 타입을 알려주는 함수이다. RECEIVE_MESSAGE를 호출하여 로컬 버퍼에 가져온 다음 NEXT_ITEM_TYPE을 호출하고 반환된 타입에 맞는 UNPACK_MESSAGE 프러시저를 호출하여 데이터를 읽어올 수 있다.
NEXT_ITEM_TYPE 함수의 세부 내용은 다음과 같다.
프로토타입
DBMS_PIPE.NEXT_ITEM_TYPE RETURN PLS_INTEGER;
반환값
반환값 | 설명 |
---|---|
0 | 더 이상 아이템이 없는 경우 반환한다. |
9 | 아이템의 데이터 타입이 VARCHAR2일 경우 반환한다. |
예제
DECLARE
status pls_integer;
type pls_integer;
BEGIN
status := DBMS_PIPE.RECEIVE_MESSAGE('tbpipe');
type := DBMS_PIPE.NEXT_ITEM_TYPE;
-- 타입에 맞는 UNPACK_MESSAGE 프러시저 호출
END;
로컬 메시지 버퍼 안에서 메시지를 만드는 프러시저이다. 이 프러시저를 호출하여 로컬 버퍼에 단위 데이터(아이템)를 저장하고, 1개 이상의 아이템이 저장되면 SEND_MESSAGE 함수를 호출하여 하나의 메시지로 합쳐서 파이프에 보낼 수 있다.
PACK_MESSAGE 프러시저의 세부 내용은 다음과 같다.
프로토타입
DBMS_PIPE.PACK_MESSAGE ( item IN VARCHAR2 );
파라미터
파라미터 | 설명 |
---|---|
item | 로컬 버퍼에 저장할 아이템이다. |
예제
DECLARE
msg VARCHAR2(2000);
BEGIN
msg := 'tibero';
DBMS_PIPE.PACK_MESSAGE(msg);
END;
파이프에 저장되어 있는 모든 내용을 비우는 프러시저이다.
프로토타입
DBMS_PIPE.PURGE ( pipename IN VARCHAR2 );
파라미터
파라미터 | 설명 |
---|---|
pipename | 저장된 모든 메시지를 비울 파이프의 이름이다. |
예제
BEGIN DBMS_PIPE.PURGE('tbpipe'); END;
파이프에 저장되어 있는 메시지 한 개를 로컬 버퍼에 읽어오는 함수이다.
RECEIVE_MESSAGE 함수의 세부 내용은 다음과 같다.
프로토타입
DBMS_PIPE.RECEIVE_MESSAGE ( pipename IN VARCHAR2, timeout IN INTEGER DEFAULT MAXWAIT ) RETURN PLS_INTEGER;
파라미터
파라미터 | 설명 |
---|---|
pipename | 저장된 메시지를 읽어올 파이프의 이름이다. |
timeout | 메시지를 기다릴 시간을 초 단위로 설정한다. (기본값: MAXWAIT, 86400000(1000일)) |
반환값
반환값 | 설명 |
---|---|
0 | 파이프에 저장되어 있는 메시지 한 개를 로컬 버퍼에 읽어온 경우에 반환한다. |
1 | 지정된 타임아웃 시간을 초과한 경우 반환한다. |
예제
DECLARE status pls_integer; BEGIN status := DBMS_PIPE.RECEIVE_MESSAGE('tbpipe'); END:
로컬에 있는 읽기 버퍼 및 쓰기 버퍼의 모든 내용을 비우는 프러시저이다. 새로운 파이프에 대한 읽기 및 쓰기를 위해 현재 로컬에 남아 있는 메시지를 비울 때 사용할 수 있다.
RESET_BUFFER 프러시저의 세부 내용은 다음과 같다.
프로토타입
DBMS_PIPE.RESET_BUFFER;
예제
BEGIN DBMS_PIPE.RESET_BUFFER; END:
명시적으로 생성된 파이프 및 파이프에 저장되어 있던 모든 내용을 제거하는 함수이다. 단, 이 함수를 호출하지 않고 인스턴스가 종료되어도 파이프는 제거된다.
파이프가 제거되는 경우 0을 반환한다. 이미 제거된 파이프에 대해서 해당 함수를 호출한 경우에도 0을 반환한다.
REMOVE_PIPE 함수의 세부 내용은 다음과 같다.
프로토타입
DBMS_PIPE.REMOVE_PIPE ( pipename IN VARCHAR2 ) RETURN PLS_INTEGER;
파라미터
파라미터 | 설명 |
---|---|
pipename | 제거하려는 파이프의 이름이다. |
반환값
반환값 | 설명 |
---|---|
0 | 생성된 파이프 및 파이프에 저장되어 있던 모든 내용이 제거된 경우 반환한다. |
예제
DECLARE status pls_integer; BEGIN status := DBMS_PIPE.REMOVE_PIPE('tbpipe'); END;
로컬 버퍼에 저장되어 있던 메시지를 파이프에 저장하는 함수이다. PACK_MESSAGE를 한 번 이상 호출하여 누적된 아이템들이 하나의 메시지로 구성되어 전송된다. 존재하지 않는 파이프의 이름이 인자로 들어오는 경우, 묵시적으로 private 파이프를 생성한다.
SEND_MESSAGE 함수의 세부 내용은 다음과 같다.
프로토타입
DBMS_PIPE.SEND_MESSAGE ( pipename IN VARCHAR2, timeout IN INTEGER DEFAULT MAXWAIT, maxpipesize IN INTEGER DEFAULT 8192 ) RETURN PLS_INTEGER;
파라미터
파라미터 | 설명 |
---|---|
pipename | 메시지를 송신할 파이프의 이름이다. |
timeout | 메시지를 기다릴 시간을 초 단위로 설정한다. (기본값: MAXWAIT, 86400000(1000일)) |
maxpipesize | Byte 단위이며, 파이프에 해당 메시지를 보낼 때 사용가능한 최대 크기이다. 최대 사이즈를 초과하는 경우, 메시지를 파이프에 쓰지 못한다. (기본값: 8192Bytes) |
반환값
반환값 | 설명 |
---|---|
0 | 로컬 버퍼에 저장되어 있던 메시지가 파이프에 저장된 경우 반환한다. |
1 | 지정된 타임아웃 시간을 초과한 경우 반환한다. |
예제
DECLARE msg VARCHAR2(2000); status pls_integer; BEGIN msg := 'tibero1'; DBMS_PIPE.PACK_MESSAGE(msg); msg := 'tibero2'; DBMS_PIPE.PACK_MESSAGE(msg); status := DBMS_PIPE.SEND_MESSAGE('tbpipe'); END;
데이터베이스에 연결되어 있는 모든 세션들 중에 식별할 수 있는 유일한 이름을 반환하는 함수이다. 동일한 세션에서 이 함수를 호출할 때마다 항상 같은 값을 반환하며, 이 함수를 이용해 자신 세션 안에서만 사용할 수 있는 파이프의 이름을 지정할 수 있다.
UNIQUE_SESSION_NAME 함수의 세부 내용은 다음과 같다.
프로토타입
DBMS_PIPE.UNIQUE_SESSION_NAME RETURN VARCHAR2;
반환값
세션 단위로 유일한 이름이다.
예제
DECLARE status pls_integer; begin status := DBMS_PIPE.CREATE_PIPE(DBMS_PIPE.UNIQUE_SESSION_NAME, 1000, false); status := DBMS_PIPE.SEND_MESSAGE(DBMS_PIPE.UNIQUE_SESSION_NAME); status := DBMS_PIPE.RECEIVE_MESSAGE(DBMS_PIPE.UNIQUE_SESSION_NAME); status := DBMS_PIPE.REMOVE_PIPE(DBMS_PIPE.UNIQUE_SESSION_NAME); END;
로컬 메시지 버퍼 안에 저장되어 있는 아이템 하나를 읽어오는 프러시저이다. RECEIVE_MESSAGE 함수를 호출하여 파이프로부터 읽어온 메시지를 로컬 읽기 버퍼에 저장하고, UNPACK_MESSAGE 프러시저를 호출하여 메시지 안의 아이템들을 하나씩 가져올 수 있다.
UNPACK_MESSAGE 프러시저의 세부 내용은 다음과 같다.
프로토타입
DBMS_PIPE.UNPACK_MESSAGE ( item OUT VARCHAR2 );
파라미터
파라미터 | 설명 |
---|---|
item | 로컬 버퍼에서 읽어올 아이템이다. |
예제
DECLARE msg VARCHAR2(2000); BEGIN DBMS_PIPE.UNPACK_MESSAGE(msg); END;