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
의 영구 메시지:
-
매우 큰 메시지를 보내고 검색하는 기능을 지원합니다.
-
많은 수의 파이프 메시지를 지원합니다.
-
단일 데이터베이스, 여러 데이터베이스, 여러 리전의 데이터베이스 간 메시지 공유를 지원합니다.
-
동일한 클라우드 객체 저장소 위치 URI를 사용하여 여러 파이프를 지원합니다.
영구 메시징 기능을 사용하면 둘 이상의 데이터베이스 세션이 클라우드 객체 저장소에 저장된 메시지와 통신할 수 있습니다. 파이프에서 이 기능 메시지를 사용하면 현재 데이터베이스에서만 사용할 수 있고, 동일한 영역의 여러 데이터베이스 또는 여러 영역에서 사용할 수 있습니다.
영구 메시징 파이프는 지원되는
DBMS_PIPE
유형 중 하나일 수 있습니다.- 암시적 파이프:
DBMS_PIPE.SEND_MESSAGE
함수를 사용하여 알 수 없는 파이프 이름으로 메시지를 보낼 때 자동으로 생성됩니다. - 명시적 파이프: 사용자가 지정한 파이프 이름과 함께
DBMS_PIPE.CREATE_PIPE
함수를 사용하여 생성됩니다. - 공용 파이프:
DBMS_PIPE
패키지에 대해EXECUTE
권한이 있는 모든 사용자가 액세스할 수 있습니다. - 전용 파이프: 파이프 작성자와 동일한 사용자가 있는 세션에서 액세스할 수 있습니다.
- 암시적 파이프:
주:
영구 메시지를 사용하여 여러 데이터베이스에서 메시지를 보내고 받을 때 Oracle은 메시지를 보내거나 받기 전에DBMS_PIPE.CREATE_PIPE
을 호출할 것을 권장합니다. DBMS_PIPE.CREATE_PIPE
를 사용하여 명시적 파이프를 만들면 PRIVATE
매개변수를 FALSE
로 설정하거나 기본값 TRUE
를 사용하여 원하는 액세스 권한(public 또는 private)으로 파이프가 만들어집니다.
DBMS_PIPE 제한
DBMS_PIPE
패키지는 서로 다른 문자 집합을 사용하는 데이터베이스 간의 메시지 전송을 지원하지 않습니다. 예를 들어, AL32UTF8를 사용하는 Autonomous Database 인스턴스 하나와 WE8MSWIN1252를 사용하는 다른 인스턴스가 있는 경우 이 두 데이터베이스 간에 DBMS_PIPE
를 사용하는 메시지를 전송할 수 없습니다. 이 경우 두 데이터베이스 간에 DBMS_PIPE
를 사용하여 메시지를 보내려고 하면 시스템에서 ORA-12704
오류가 발생합니다.
영구 메시징을 위한 DBMS_PIPE 서브 프로그램 요약
이 표에서는 DBMS_PIPE
서브 프로그램을 나열하고 이에 대해 간략하게 설명합니다.
표 - DBMS_PIPE 패키지 서브 프로그램
하위 프로그램 | 설명 |
---|---|
파이프(개인 파이프에 필요)를 작성합니다. |
|
전역 |
|
메시지가 클라우드 객체 저장소에 저장될 때 사용할 기본 위치 URI로 사용되는 전역 |
|
버퍼에 있는 다음 항목의 데이터 유형을 반환합니다. |
|
로컬 버퍼에서 메시지를 작성합니다. |
|
이름이 지정된 파이프에서 로컬 버퍼로 메시지를 복사합니다. |
|
로컬 버퍼의 내용을 비웁니다. |
|
명명된 파이프를 제거합니다. |
|
명명된 파이프에 메시지 보내기: 명명된 파이프가 없으면 공용 파이프를 암시적으로 작성합니다. |
|
클라우드 객체 저장소에 저장된 메시지에 대한 기본 인증서로 사용되는 |
|
클라우드 객체 저장소에 저장된 메시지에 대한 기본 위치 URI로 사용되는 전역 |
|
고유한 세션 이름을 반환합니다. |
|
버퍼의 다음 항목에 액세스합니다. |
CREATE_PIPE 함수
이 함수는 공용 또는 전용 파이프를 명시적으로 작성합니다. private
플래그가 TRUE
인 경우 파이프 작성자가 개인 파이프의 소유자로 지정됩니다.
명시적으로 생성된 파이프는 REMOVE_PIPE
를 호출하거나 인스턴스를 종료해야만 제거할 수 있습니다.
구문
DBMS_PIPE.CREATE_PIPE ( pipename IN VARCHAR2, maxpipesize IN INTEGER DEFAULT 66536, private IN BOOLEAN DEFAULT TRUE) RETURN INTEGER;
매개변수
테이블 - CREATE_PIPE 함수 매개변수
매개변수 | 설명 |
---|---|
|
만들려는 파이프의 이름입니다.
주의: |
|
파이프에 대해 허용된 최대 크기(바이트)입니다. 파이프에 있는 모든 메시지의 총 크기는 이 양을 초과할 수 없습니다. 이 최대값을 초과하면 메시지가 차단됩니다. 기본 파이프의 모든 파이프에 대해 기본값 |
|
기본값 공용 파이프는 |
반환 값
테이블 - CREATE_PIPE 함수 반환 값
Return | 설명 |
---|---|
|
성공. 파이프가 이미 있고 파이프를 만들려는 사용자가 파이프를 사용할 권한이 있는 경우 Oracle은 성공을 나타내는 0을 반환하며 파이프에 이미 있는 모든 데이터는 남아 있습니다. |
|
이름 지정 충돌로 인해 실패했습니다. 이름이 동일한 파이프가 있고 다른 사용자가 만든 경우 Oracle은 이름 지정 충돌을 나타내는 오류 |
예외사항
테이블 - CREATE_PIPE 함수 예외
예외사항 | 설명 |
---|---|
|
권한 오류: 동일한 이름의 파이프가 이미 있으며 사용할 수 없습니다. |
예
MY_PIPE1
라는 명시적 private를 생성합니다.
DECLARE
l_status INTEGER;
BEGIN
l_status := DBMS_PIPE.create_pipe(
pipename => 'MY_PIPE1',
private => TRUE);
END;
/
GET_CREDENTIAL_NAME 함수
이 함수는 메시지가 클라우드 객체 저장소에 저장될 때 사용할 전역 credential_name
변수 값을 반환합니다.
구문
DBMS_PIPE.GET_CREDENTIAL_NAME RETURN VARCHAR2;
반환 값
반환 값 | 설명 |
---|---|
|
클라우드 객체 스토리지에 액세스할 인증서의 이름입니다. |
예
DECLARE
credential_name VARCHAR2(400)
BEGIN
credential_name := DBMS_PIPE.GET_CREDENTIAL_NAME;
END;
/
GET_LOCATION_URI 함수
이 함수는 파이프 메시지가 클라우드 객체 저장소에 저장될 때 기본 위치 URI로 사용될 수 있는 전역 location_uri
변수 값을 반환합니다.
구문
DBMS_PIPE.GET_LOCATION_URI RETURN VARCHAR2;
반환 값
반환 값 | 설명 |
---|---|
location_uri |
객체 URI입니다. |
예
DECLARE
location_uri VARCHAR2(400)
BEGIN
location_uri := DBMS_PIPE.GET_LOCATION_URI;
END;
/
RECEIVE_MESSAGE 함수
이 함수는 메시지를 로컬 메시지 버퍼로 복사합니다.
구문
DBMS_PIPE.RECEIVE_MESSAGE ( pipename IN VARCHAR2, timeout IN INTEGER DEFAULT maxwait, credential_name IN VARCHAR2 DEFAULT null, location_uri IN VARCHAR2) RETURN INTEGER;
매개변수
테이블 - RECEIVE_MESSAGE 함수 매개변수
매개변수 | 설명 |
---|---|
|
메시지를 수신할 파이프의 이름입니다.
|
|
메시지를 기다리는 시간(초)입니다. 시간 초과가 0이면 차단하지 않고 읽을 수 있습니다. 시간 초과에는 기본값은 86400000(1000일)으로 정의된 상수 |
|
메시지 저장에 사용되는 클라우드 저장소의 인증서 이름입니다.
자격 증명 객체는 |
|
메시지 저장에 사용되는 클라우드 저장소의 위치 URI입니다.
|
반환 값
테이블 - RECEIVE_MESSAGE 함수 반환 값
Return | 설명 |
---|---|
|
성공 |
|
시간 초과됨. 파이프가 암시적으로 작성되고 비어 있으면 제거됩니다. |
|
파이프의 레코드가 버퍼에 비해 너무 큽니다. |
|
인터럽트 발생. |
|
사용자에게 파이프에서 읽을 수 있는 충분한 권한이 없습니다. |
사용법 참고
-
파이프에서 메시지를 수신하려면 먼저
RECEIVE_MESSAGE
을 호출합니다. 메시지를 받으면 파이프에서 제거되므로 한 번만 메시지를 받을 수 있습니다. 암시적으로 작성된 파이프의 경우 파이프에서 마지막 레코드가 제거된 후 파이프가 제거됩니다. -
RECEIVE_MESSAGE
를 호출할 때 지정한 파이프가 존재하지 않을 경우 Oracle은 암시적으로 파이프를 만들고 메시지를 받을 때까지 기다립니다. 메시지가 지정된 시간 초과 간격 내에 도착하지 않으면 호출이 반환되고 파이프가 제거됩니다. -
메시지를 받은 후 메시지의 개별 항목에 액세스하려면
UNPACK_MESSAGE
에 대해 하나 이상의 호출을 수행해야 합니다.UNPACK_MESSAGE
프로시저는DATE
,NUMBER
,VARCHAR2
유형의 항목 포장을 풀기 위해 오버로드되며RAW
및ROWID
항목의 포장을 풀기 위한 두 가지 추가 절차가 있습니다. 압축을 풀려는 데이터 유형을 모르는 경우NEXT_ITEM_TYPE
를 호출하여 버퍼의 다음 항목 유형을 확인합니다. -
지속 메시지는 정확히 하나의 프로세스에서 쓰거나 읽도록 보장됩니다. 이렇게 하면 동시 쓰기 및 읽기로 인해 메시지 내용이 일치하지 않습니다.
DBMS_PIPE
에서는 영구 메시징 파이프를 사용하여 한 번에 메시지 또는 수신 메시지를 보내는 작업이 하나만 활성화되도록 허용합니다. 그러나 진행 중인 작업으로 인해 작업이 불가능한 경우timeout
값에 도달할 때까지 프로세스가 주기적으로 재시도됩니다. -
Oracle Cloud Infrastructure Object Storage를 사용하여 메시지를 저장하는 경우 Oracle Cloud Infrastructure 고유 URI 또는 Swift URI를 사용할 수 있습니다. 그러나 위치 URI와 자격 증명은 다음과 같은 유형과 일치해야 합니다.
-
고유 URI 형식을 사용하여 Oracle Cloud Infrastructure Object Storage에 액세스하는 경우 인증서 객체에서 고유 Oracle Cloud Infrastructure 서명 키 인증을 사용해야 합니다.
-
Swift URI 형식을 사용하여 Oracle Cloud Infrastructure Object Storage에 액세스하는 경우 인증서 객체에서 인증 토큰 인증을 사용해야 합니다.
-
예외사항
표 - RECEIVE_MESSAGE 함수 예외
예외사항 | 설명 |
---|---|
|
권한 오류. 권한이 부족하여 파이프에서 레코드를 제거할 수 없습니다. 파이프는 다른 사람이 소유하고 있습니다. |
SEND_MESSAGE 함수
이 함수는 명명된 파이프에 메시지를 보냅니다.
메시지는 PACK_MESSAGE
에 대한 호출로 채워진 로컬 메시지 버퍼에 포함됩니다. CREATE_PIPE
를 사용하여 명시적으로 파이프를 만들 수 있습니다. 그렇지 않으면 암시적으로 만들어집니다.
구문
DBMS_PIPE.SEND_MESSAGE ( pipename IN VARCHAR2, timeout IN INTEGER DEFAULT MAXWAIT, credential_name IN VARCHAR2 DEFAULT null, location_uri IN VARCHAR2 ) RETURN INTEGER;
매개변수
테이블 - SEND_MESSAGE 함수 매개변수
매개변수 | 설명 |
---|---|
credential_name |
메시지 저장에 사용되는 클라우드 저장소의 인증서 이름입니다.
자격 증명 객체는 |
location_uri |
메시지 저장에 사용되는 클라우드 저장소의 위치 URI입니다.
|
|
파이프에 허용되는 최대 크기(바이트). 파이프에 있는 모든 메시지의 총 크기는 이 양을 초과할 수 없습니다. 이 최대값을 초과하면 메시지가 차단됩니다. 기본값은 65536바이트입니다. 파이프의
모든 파이프에 대해 기본값 |
|
메시지를 배치할 파이프의 이름입니다. 명시적 파이프를 사용하는 경우 주의: ' |
|
파이프에 메시지를 배치하려고 시도하는 동안 기다리는 시간(초)입니다. 기본값은 상수 |
반환 값
테이블 - SEND_MESSAGE 함수 반환 값
Return | 설명 |
---|---|
|
성공. 파이프가 이미 있고 파이프를 만들려는 사용자가 파이프를 사용할 권한이 있는 경우 Oracle은 성공을 나타내는 0을 반환하며 파이프에 이미 있는 모든 데이터는 남아 있습니다.
|
|
시간 초과됨. 이 절차는 파이프에 대한 잠금을 얻을 수 없거나 파이프가 너무 가득 차서 사용할 수 없기 때문에 시간 초과될 수 있습니다. 파이프가 암시적으로 작성되고 비어 있으면 제거됩니다. |
|
인터럽트 발생. 파이프가 암시적으로 작성되고 비어 있으면 제거됩니다. |
|
권한이 없습니다. 이름이 동일한 파이프가 있고 다른 사용자가 만든 경우 Oracle은 이름 지정 충돌을 나타내는 오류 |
사용법 참고
-
지속 메시지는 정확히 하나의 프로세스에서 쓰거나 읽도록 보장됩니다. 이렇게 하면 동시 쓰기 및 읽기로 인해 메시지 내용이 일치하지 않습니다.
DBMS_PIPE
에서는 영구 메시징 파이프를 사용하여 한 번에 메시지 또는 수신 메시지를 보내는 작업이 하나만 활성화되도록 허용합니다. 그러나 진행 중인 작업으로 인해 작업이 불가능한 경우timeout
값에 도달할 때까지 프로세스가 주기적으로 재시도됩니다. -
Oracle Cloud Infrastructure Object Storage를 사용하여 메시지를 저장하는 경우 Oracle Cloud Infrastructure 고유 URI 또는 Swift URI를 사용할 수 있습니다. 그러나 위치 URI와 자격 증명은 다음과 같은 유형과 일치해야 합니다.
-
고유 URI 형식을 사용하여 Oracle Cloud Infrastructure Object Storage에 액세스하는 경우 인증서 객체에서 고유 Oracle Cloud Infrastructure 서명 키 인증을 사용해야 합니다.
-
Swift URI 형식을 사용하여 Oracle Cloud Infrastructure Object Storage에 액세스하는 경우 인증서 객체에서 인증 토큰 인증을 사용해야 합니다.
-
예외사항
테이블 - SEND_MESSAGE 함수 예외
예외사항 | 설명 |
---|---|
|
권한 오류. 권한이 부족하여 파이프에 쓸 수 없습니다. 파이프는 개인용이며 다른 사람이 소유합니다. |
SET_CREDENTIAL_NAME 프로시저
이 절차에서는 파이프 메시지가 클라우드 객체 저장소에 저장될 때 기본 인증서로 사용되는 credential_name
변수를 설정합니다.
구문
DBMS_PIPE.SET_CREDENTIAL_NAME ( credential_name IN VARCHAR2 );
매개변수
매개변수 | 설명 |
---|---|
|
클라우드 객체 스토리지에 액세스할 인증서의 이름입니다. |
사용법 노트
Oracle Cloud Infrastructure Object Storage를 사용하여 메시지를 저장하는 경우 Oracle Cloud Infrastructure 고유 URI 또는 Swift URI를 사용할 수 있습니다. 그러나 위치 URI와 자격 증명은 다음과 같은 유형과 일치해야 합니다.
-
고유 URI 형식을 사용하여 Oracle Cloud Infrastructure Object Storage에 액세스하는 경우 인증서 객체에서 고유 Oracle Cloud Infrastructure 서명 키 인증을 사용해야 합니다.
-
Swift URI 형식을 사용하여 Oracle Cloud Infrastructure Object Storage에 액세스하는 경우 인증서 객체에서 인증 토큰 인증을 사용해야 합니다.
예
BEGIN
DBMS_PIPE.SET_CREDENTIAL_NAME(
credential_name => 'my_cred1');
END;
/
SET_LOCATION_URI 프로시저
이 절차에서는 전역 location_uri
변수를 설정합니다.
구문
DBMS_PIPE.SET_LOCATION_URI ( location_uri IN VARCHAR2 );
매개변수
매개변수 | 설명 |
---|---|
location_uri |
객체 또는 파일 URI입니다. URI의 형식은 사용 중인 클라우드 오브젝트 스토리지 서비스에 따라 다릅니다. 자세한 내용은 클라우드 오브젝트 스토리지 URI 형식을 참조하십시오. |
사용법 노트
Oracle Cloud Infrastructure Object Storage를 사용하여 메시지를 저장하는 경우 Oracle Cloud Infrastructure 고유 URI 또는 Swift URI를 사용할 수 있습니다. 그러나 위치 URI와 자격 증명은 다음과 같은 유형과 일치해야 합니다.
-
고유 URI 형식을 사용하여 Oracle Cloud Infrastructure Object Storage에 액세스하는 경우 인증서 객체에서 고유 Oracle Cloud Infrastructure 서명 키 인증을 사용해야 합니다.
-
Swift URI 형식을 사용하여 Oracle Cloud Infrastructure Object Storage에 액세스하는 경우 인증서 객체에서 인증 토큰 인증을 사용해야 합니다.
예
BEGIN
DBMS_PIPE.GET_LOCATION_URI(
location_uri => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname1/');
END;
/