DBMS_PIPE 패키지(싱글톤 파이프)
DBMS_PIPE
패키지를 사용하면 동일한 Instance에 있는 두 개 이상의 세션이 통신할 수 있습니다.
Oracle Autonomous Database on Dedicated Exadata Infrastructure는 Oracle Database 19c에서 제공하는 핵심 DBMS_PIPE
기능과 확장 기능을 지원합니다.
Oracle Database에서 제공되는 핵심 DBMS_PIPE
기능에 대한 자세한 내용은 DBMS_PIPE in Oracle Database 19c PL/SQL Packages and Types Reference 또는 Oracle Database 23ai PL/SQL Packages and Types Reference를 참조하십시오.
관련 항목
DBMS_PIPE 싱글톤 파이프 개요
파이프 기능에는 외부 서비스 인터페이스, 디버깅, 독립 트랜잭션 및 경보와 같은 여러 가지 잠재적 응용 프로그램이 있습니다.
Autonomous Database에서 DBMS_PIPE 패키지는 싱글톤 파이프를 지원하는 확장된 기능을 제공합니다. 자세한 내용은 DBMS_PIPE in Oracle Database 19c PL/SQL Packages and Types Reference 또는 Oracle Database 23ai PL/SQL Packages and Types Reference를 참조하십시오.
DBMS_PIPE
의 싱글톤 파이프 피쳐는 다음을 제공합니다.
-
Oracle 데이터베이스 메모리에서 최대 32,767바이트의 사용자정의 메시지를 캐시에 저장하고 검색하는 기능입니다. 싱글톤 파이프를 포함한 모든 파이프에는 최대 32,767바이트의 메시지 크기를 적용할 수 있습니다. 이전 버전의
DBMS_PIPE
에는 최대 메시지 크기가 더 작습니다. -
동시 읽기를 사용하여 여러 데이터베이스 세션에서 캐시된 메시지를 공유합니다.
-
캐시 무효화 방법:
- 유저가 제어하는 명시적 캐시 무효화
- 사용자가 지정한 매개변수(
shelflife
) 시간 간격(초) 후 캐시 무효화
-
캐싱에 선언적이고 사용하기 쉬운 PL/SQL API입니다.
-
읽기 전용 및 읽기-쓰기 데이터베이스를 모두 지원합니다.
싱글톤 파이프는 지원되는 DBMS_PIPE
유형 중 하나일 수 있습니다.
- 암시적 파이프:
DBMS_PIPE.SEND_MESSAGE
함수를 사용하여 알 수 없는 파이프 이름으로 메시지를 보낼 때 자동으로 생성됩니다. - 명시적 파이프: 사용자가 지정한 파이프 이름과 함께
DBMS_PIPE.CREATE_PIPE
함수를 사용하여 생성됩니다. - 공용 파이프:
DBMS_PIPE
패키지에 대해EXECUTE
권한이 있는 모든 사용자가 액세스할 수 있습니다. - 전용 파이프: 파이프 작성자와 동일한 사용자가 있는 세션에서 액세스할 수 있습니다.
싱글톤 파이프에 대한 DBMS_PIPE 하위 프로그램 요약
이 표에서는 DBMS_PIPE
서브 프로그램을 나열하고 이에 대해 간략하게 설명합니다.
표 - DBMS_PIPE 패키지 서브 프로그램
하위 프로그램 | 설명 |
---|---|
파이프 작성(개인 파이프에 필요) |
|
버퍼에 있는 다음 항목의 데이터 유형을 반환합니다. |
|
로컬 버퍼에서 메시지 작성 |
|
명명된 파이프의 내용을 비웁니다. |
|
명명된 파이프에서 로컬 버퍼로 메시지를 복사합니다. |
|
로컬 버퍼의 내용을 비웁니다. |
|
명명된 파이프를 제거합니다. |
|
명명된 파이프에 메시지 보내기: 명명된 파이프가 없으면 공용 파이프를 암시적으로 작성합니다. |
|
고유한 세션 이름을 반환합니다. |
|
버퍼의 다음 항목에 액세스합니다. |
CREATE_PIPE 함수
이 함수는 공용 또는 전용 파이프를 명시적으로 작성합니다. private
플래그가 TRUE
인 경우 파이프 작성자가 개인 파이프의 소유자로 지정됩니다.
명시적으로 생성된 파이프는 REMOVE_PIPE
를 호출하거나 인스턴스를 종료해야만 제거할 수 있습니다.
싱글톤 파이프를 만들려면 singleton
매개변수를 TRUE
로 설정합니다. 다음 인수는 싱글톤 파이프에 적용할 수 있습니다.
-
singleton
: 파이프를 싱글톤 파이프로 생성해야 함을 나타냅니다(기본값:FALSE
). -
shelflife
: 선택적으로 싱글톤 파이프에서 캐시된 메시지의 Shelflife 만료(초)를 지정합니다. 싱글톤 파이프에서 메시지를 암시적으로 무효화하는 데 사용할 수 있습니다.메시지 메시지를 보낼 때 싱글톤 파이프의
shelflife
메시지를 지정할 수도 있습니다(SEND_MESSAGE 함수 참조).
구문
DBMS_PIPE.CREATE_PIPE ( pipename IN VARCHAR2, maxpipesize IN INTEGER DEFAULT 66536, private IN BOOLEAN DEFAULT TRUE, singleton IN BOOLEAN DEFAULT FALSE, shelflife IN INTEGER DEFAULT 0) RETURN INTEGER;
매개변수
테이블 - CREATE_PIPE 함수 매개변수
매개변수 | 설명 |
---|---|
|
만들려는 파이프의 이름입니다.
주의: |
|
파이프에 대해 허용된 최대 크기(바이트)입니다. 파이프에 있는 모든 메시지의 총 크기는 이 양을 초과할 수 없습니다. 이 최대값을 초과하면 메시지가 차단됩니다. 기본 파이프의 모든 파이프에 대해 기본값 |
|
기본값 공용 파이프는 |
|
기본값: |
|
싱글톤 파이프에 캐시된 메시지의 만료 시간(초)입니다. 지정된 기본값은 메시지가 만료되지 않도록 하는 |
반환 값
테이블 - CREATE_PIPE 함수 반환 값
Return | 설명 |
---|---|
|
성공. 파이프가 이미 있고 파이프를 만들려는 사용자가 파이프를 사용할 권한이 있는 경우 Oracle은 성공을 나타내는 0을 반환하며 파이프에 이미 있는 모든 데이터는 남아 있습니다. |
|
기존 파이프를 싱글톤 파이프로 변환하지 못했습니다.
|
|
|
|
이름 지정 충돌로 인해 실패했습니다. 이름이 동일한 파이프가 있고 다른 사용자가 만든 경우 Oracle은 이름 지정 충돌을 나타내는 오류 |
예외사항
테이블 - CREATE_PIPE 함수 예외
예외사항 | 설명 |
---|---|
|
권한 오류: 동일한 이름의 파이프가 이미 있으며 사용할 수 없습니다. |
예
Shelflife가 1시간인 싱글톤 파이프를 만듭니다.
DECLARE
l_status INTEGER;
BEGIN
l_status := DBMS_PIPE.create_pipe(pipename => 'MY_PIPE1',
private => TRUE,
singleton => TRUE,
shelflife => 3600);
END;
/
RECEIVE_MESSAGE 함수
이 함수는 메시지를 로컬 메시지 버퍼로 복사합니다.
구문
DBMS_PIPE.RECEIVE_MESSAGE ( pipename IN VARCHAR2, timeout IN INTEGER DEFAULT maxwait, cache_func IN VARCHAR2 DEFAULT NULL) RETURN INTEGER;
매개변수
테이블 - RECEIVE_MESSAGE 함수 매개변수
매개변수 | 설명 |
---|---|
|
메시지를 수신할 파이프의 이름입니다.
|
|
메시지를 기다리는 시간(초)입니다. 시간 초과가 0이면 차단하지 않고 읽을 수 있습니다. 시간 초과에는 기본값은 86400000(1000일)으로 정의된 상수 |
|
싱글톤 파이프에서 메시지를 자동으로 캐시하는 캐시 함수 이름입니다. 함수 이름은 소유자 스키마로 정규화되어야 합니다.
기본값: |
반환 값
테이블 - RECEIVE_MESSAGE 함수 반환 값
Return | 설명 |
---|---|
|
성공 |
|
시간 초과됨. 파이프가 암시적으로 작성되고 비어 있으면 제거됩니다. |
|
파이프의 레코드가 버퍼에 비해 너무 큽니다. |
|
인터럽트 발생. |
8 |
단일 파이프를 사용하는 경우에만 캐시 함수를 지정할 수 있습니다. |
|
사용자에게 파이프에서 읽을 수 있는 충분한 권한이 없습니다. |
사용법 참고
파이프에서 메시지를 수신하려면 먼저 RECEIVE_MESSAGE
을 호출합니다. 메시지를 받으면 파이프에서 제거되므로 한 번만 메시지를 받을 수 있습니다. 암시적으로 작성된 파이프의 경우 파이프에서 마지막 레코드가 제거된 후 파이프가 제거됩니다.
RECEIVE_MESSAGE
를 호출할 때 지정한 파이프가 존재하지 않을 경우 Oracle은 암시적으로 파이프를 만들고 메시지를 받을 때까지 기다립니다. 메시지가 지정된 시간 초과 간격 내에 도착하지 않으면 호출이 반환되고 파이프가 제거됩니다.
메시지를 받은 후 메시지의 개별 항목에 액세스하려면 UNPACK_MESSAGE
에 대해 하나 이상의 호출을 수행해야 합니다. UNPACK_MESSAGE
프로시저는 DATE
, NUMBER
, VARCHAR2
유형의 항목 포장을 풀기 위해 오버로드되며 RAW
및 ROWID
항목의 포장을 풀기 위한 두 가지 추가 절차가 있습니다. 압축을 풀려는 데이터 유형을 모르는 경우 NEXT_ITEM_TYPE
를 호출하여 버퍼의 다음 항목 유형을 확인합니다.
캐시 함수 매개변수
싱글톤 파이프는 캐시 기능을 지원하여 다음 두 가지 시나리오의 경우 파이프에 메시지를 자동으로 캐시합니다.
- 싱글톤 파이프가 비어 있습니다.
shelflife
시간이 경과되어 싱글톤 파이프의 메시지가 부적합합니다.
함수 이름은 소유자 스키마로 정규화되어야 합니다.
OWNER.FUNCTION_NAME
OWNER.PACKAGE.FUNCTION_NAME
캐시 함수를 사용하려면 DBMS_PIPE.RECEIVE_MESSAGE
를 호출하는 현재 세션 사용자에게 캐시 함수를 실행하는 데 필요한 권한이 있어야 합니다.
캐시 함수 구문
CREATE OR REPLACE FUNCTION cache_function_name (
pipename IN VARCHAR2
) RETURN INTEGER;
매개변수 | 데이터 유형 | 설명 |
---|---|---|
|
VARCHAR2 |
싱글톤 파이프의 이름입니다. |
Return | 설명 |
---|---|
0 | 성공 |
0이 아님 | DBMS_PIPE.RECEIVE_MESSAGE 에서 실패 값이 반환됨 |
싱글톤 파이프의 리더 세션에서 복잡성을 캡슐화하고 추상화하도록 캐시 함수를 정의합니다. 캐시 함수 내의 일반적인 작업은 다음과 같습니다.
DBMS_PIPE.CREATE_PIPE
를 사용하여 명시적 파이프에 대한 싱글톤 파이프를 작성합니다.- 싱글톤 파이프에 캐시할 메시지를 작성합니다.
- 메시지를 싱글톤 파이프로 보냅니다. 선택적으로 암시적 메시지에 대해
shelflife
를 지정합니다.
예외사항
표 - RECEIVE_MESSAGE 함수 예외
예외사항 | 설명 |
---|---|
|
권한 오류. 권한이 부족하여 파이프에서 레코드를 제거할 수 없습니다. 파이프는 다른 사람이 소유하고 있습니다. |
예
DECLARE
l_status INTEGER;
BEGIN
l_status := DBMS_PIPE.receive_message(pipename => 'MY_PIPE1',
timeout => 1,
cache_func => 'MY_USER.MY_CACHE_FUNC');
END;
/
SEND_MESSAGE 함수
이 함수는 명명된 파이프에 메시지를 보냅니다.
메시지는 PACK_MESSAGE
에 대한 호출로 채워진 로컬 메시지 버퍼에 포함됩니다. CREATE_PIPE
를 사용하여 명시적으로 파이프를 만들 수 있습니다. 그렇지 않으면 암시적으로 만들어집니다.
암시적 싱글톤 파이프를 만들려면 singleton
매개변수를 TRUE
로 설정합니다. 다음 인수는 싱글톤 파이프에 적용할 수 있습니다.
singleton
: 파이프를 싱글톤 파이프로 생성해야 함을 나타냅니다(기본값:FALSE
).shelflife
: 선택적으로 싱글톤 파이프에서 캐시된 메시지의 Shelflife 만료를 지정합니다. 싱글톤 파이프에서 메시지를 암시적으로 무효화하는 데 사용할 수 있습니다.이 인수는 암시적 싱글톤 파이프 및 명시적 싱글톤 파이프에 적용할 수 있습니다. SEND_MESSAGE 함수에 지정된
shelflife
값은 CREATE_PIPE 함수의 명시적 싱글톤 파이프에 대해 지정된shelflife
를 덮어쓰며 싱글톤 파이프에 캐시된 새 메시지의 기본값이 됩니다.
구문
DBMS_PIPE.SEND_MESSAGE ( pipename IN VARCHAR2, timeout IN INTEGER DEFAULT MAXWAIT, maxpipesize IN INTEGER DEFAULT 65536, singleton IN BOOLEAN DEFAULT FALSE, shelflife IN INTEGER DEFAULT 0) RETURN INTEGER;
매개변수
테이블 - SEND_MESSAGE 함수 매개변수
매개변수 | 설명 |
---|---|
|
메시지를 배치할 파이프의 이름입니다. 명시적 파이프를 사용하는 경우 주의: ' |
|
파이프에 메시지를 배치하려고 시도하는 동안 기다리는 시간(초)입니다. 기본값은 상수 |
|
파이프에 허용되는 최대 크기(바이트). 파이프에 있는 모든 메시지의 총 크기는 이 양을 초과할 수 없습니다. 이 최대값을 초과하면 메시지가 차단됩니다. 기본값은 65536바이트입니다. 파이프의
모든 파이프에 대해 기본값 |
|
기본값: |
|
싱글톤 파이프에 캐시된 메시지의 만료 시간(초)입니다. 지정된 기본값은 메시지가 만료되지 않도록 하는 |
반환 값
테이블 - SEND_MESSAGE 함수 반환 값
Return | 설명 |
---|---|
|
성공. 파이프가 이미 있고 파이프를 만들려는 사용자가 파이프를 사용할 권한이 있는 경우 Oracle은 성공을 나타내는 0을 반환하며 파이프에 이미 있는 모든 데이터는 남아 있습니다.
|
|
시간 초과됨. 이 절차는 파이프에 대한 잠금을 얻을 수 없거나 파이프가 너무 가득 차서 사용할 수 없기 때문에 시간 초과될 수 있습니다. 파이프가 암시적으로 작성되고 비어 있으면 제거됩니다. |
|
인터럽트 발생. 파이프가 암시적으로 작성되고 비어 있으면 제거됩니다. |
|
기존 파이프를 싱글톤 파이프로 변환하지 못했습니다.
|
|
|
|
권한이 없습니다. 이름이 동일한 파이프가 있고 다른 사용자가 만든 경우 Oracle은 이름 지정 충돌을 나타내는 오류 |
예외사항
테이블 - SEND_MESSAGE 함수 예외
예외사항 | 설명 |
---|---|
|
권한 오류. 권한이 부족하여 파이프에 쓸 수 없습니다. 파이프는 개인용이며 다른 사람이 소유합니다. |