DBMS_PIPE 패키지(싱글톤 파이프)

DBMS_PIPE 패키지를 사용하면 동일한 Instance에 있는 두 개 이상의 세션이 통신할 수 있습니다.

Oracle Autonomous Database on Dedicated Exadata InfrastructureOracle 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 함수

파이프 작성(개인 파이프에 필요)

버퍼에 있는 다음 항목의 데이터 유형을 반환합니다.

로컬 버퍼에서 메시지 작성

명명된 파이프의 내용을 비웁니다.

RECEIVE_MESSAGE 함수

명명된 파이프에서 로컬 버퍼로 메시지를 복사합니다.

로컬 버퍼의 내용을 비웁니다.

명명된 파이프를 제거합니다.

SEND_MESSAGE 함수

명명된 파이프에 메시지 보내기: 명명된 파이프가 없으면 공용 파이프를 암시적으로 작성합니다.

고유한 세션 이름을 반환합니다.

버퍼의 다음 항목에 액세스합니다.

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 함수 매개변수

매개변수 설명

pipename

만들려는 파이프의 이름입니다.

SEND_MESSAGERECEIVE_MESSAGE를 호출할 때 이 이름을 사용해야 합니다. 이 이름은 전체 인스턴스에서 고유해야 합니다.

주의: ORA$로 시작하는 파이프 이름은 사용하지 마십시오. Oracle에서 제공하는 프로시저에서 사용하도록 예약되어 있습니다. Pipename은 128바이트보다 길지 않아야 하며 대소문자를 구분하지 않습니다. 현재 이름은 Globalization Support 문자를 포함할 수 없습니다.

maxpipesize

파이프에 대해 허용된 최대 크기(바이트)입니다.

파이프에 있는 모든 메시지의 총 크기는 이 양을 초과할 수 없습니다. 이 최대값을 초과하면 메시지가 차단됩니다.

기본 maxpipesize는 66536바이트입니다.

파이프의 maxpipesize는 파이프 특성의 일부가 되며 파이프 수명 동안 지속됩니다. 값이 큰 SEND_MESSAGE를 호출하면 maxpipesize가 증가합니다. 값이 작은 호출자는 더 큰 기존 값을 사용합니다.

모든 파이프에 대해 기본값 maxpipesize 65536을 적용할 수 있습니다.

private

기본값 TRUE를 사용하여 개인 파이프를 만듭니다.

공용 파이프는 SEND_MESSAGE를 호출할 때 암시적으로 생성할 수 있습니다.

singleton

TRUE를 사용하여 싱글톤 파이프를 만듭니다.

기본값: FALSE

shelflife

싱글톤 파이프에 캐시된 메시지의 만료 시간(초)입니다. 지정된 shelflife 시간을 초과하면 더 이상 파이프에서 메시지에 액세스할 수 없습니다. shelflife 매개변수는 싱글톤 파이프에만 적용할 수 있습니다.

기본값은 메시지가 만료되지 않도록 하는 0입니다.

반환 값

테이블 - CREATE_PIPE 함수 반환 값

Return 설명

0

성공.

파이프가 이미 있고 파이프를 만들려는 사용자가 파이프를 사용할 권한이 있는 경우 Oracle은 성공을 나타내는 0을 반환하며 파이프에 이미 있는 모든 데이터는 남아 있습니다.

6

기존 파이프를 싱글톤 파이프로 변환하지 못했습니다.

  • 기존 메시지가 두 개 이상 있는 암시적 파이프는 싱글톤 파이프로 변환할 수 없습니다.
  • 싱글톤이 아닌 명시적 파이프의 경우 DBMS_PIPE.SEND_MESSAGE는 싱글톤 인수가 TRUE로 설정된 메시지를 보낼 수 없습니다.

7

shelflife 매개변수에 대해 0이 아닌 값이 제공되며 파이프가 싱글톤 파이프가 아닙니다.

ORA-23322

이름 지정 충돌로 인해 실패했습니다.

이름이 동일한 파이프가 있고 다른 사용자가 만든 경우 Oracle은 이름 지정 충돌을 나타내는 오류 ORA-23322를 표시합니다.

예외사항

테이블 - CREATE_PIPE 함수 예외

예외사항 설명

Null pipe name

권한 오류: 동일한 이름의 파이프가 이미 있으며 사용할 수 없습니다.

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 함수 매개변수

매개변수 설명

pipename

메시지를 수신할 파이프의 이름입니다.

ORA$로 시작하는 이름은 Oracle에서 사용하도록 예약되어 있습니다.

timeout

메시지를 기다리는 시간(초)입니다. 시간 초과가 0이면 차단하지 않고 읽을 수 있습니다.

시간 초과에는 cache_func 매개변수에 지정된 실행 캐시 함수에 소요된 시간이 포함되지 않습니다.

기본값은 86400000(1000일)으로 정의된 상수 MAXWAIT입니다.

cache_func

싱글톤 파이프에서 메시지를 자동으로 캐시하는 캐시 함수 이름입니다.

함수 이름은 소유자 스키마로 정규화되어야 합니다.

  • OWNER.FUNCTION_NAME
  • OWNER.PACKAGE.FUNCTION_NAME

기본값: NULL

반환 값

테이블 - RECEIVE_MESSAGE 함수 반환 값

Return 설명

0

성공

1

시간 초과됨. 파이프가 암시적으로 작성되고 비어 있으면 제거됩니다.

2

파이프의 레코드가 버퍼에 비해 너무 큽니다.

3

인터럽트 발생.

8

단일 파이프를 사용하는 경우에만 캐시 함수를 지정할 수 있습니다.

ORA-23322

사용자에게 파이프에서 읽을 수 있는 충분한 권한이 없습니다.

사용법 참고

파이프에서 메시지를 수신하려면 먼저 RECEIVE_MESSAGE을 호출합니다. 메시지를 받으면 파이프에서 제거되므로 한 번만 메시지를 받을 수 있습니다. 암시적으로 작성된 파이프의 경우 파이프에서 마지막 레코드가 제거된 후 파이프가 제거됩니다.

RECEIVE_MESSAGE를 호출할 때 지정한 파이프가 존재하지 않을 경우 Oracle은 암시적으로 파이프를 만들고 메시지를 받을 때까지 기다립니다. 메시지가 지정된 시간 초과 간격 내에 도착하지 않으면 호출이 반환되고 파이프가 제거됩니다.

메시지를 받은 후 메시지의 개별 항목에 액세스하려면 UNPACK_MESSAGE에 대해 하나 이상의 호출을 수행해야 합니다. UNPACK_MESSAGE 프로시저는 DATE, NUMBER, VARCHAR2 유형의 항목 포장을 풀기 위해 오버로드되며 RAWROWID 항목의 포장을 풀기 위한 두 가지 추가 절차가 있습니다. 압축을 풀려는 데이터 유형을 모르는 경우 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;
매개변수 데이터 유형 설명

pipename

VARCHAR2

싱글톤 파이프의 이름입니다.

Return 설명
0 성공
0이 아님 DBMS_PIPE.RECEIVE_MESSAGE에서 실패 값이 반환됨

싱글톤 파이프의 리더 세션에서 복잡성을 캡슐화하고 추상화하도록 캐시 함수를 정의합니다. 캐시 함수 내의 일반적인 작업은 다음과 같습니다.

  • DBMS_PIPE.CREATE_PIPE를 사용하여 명시적 파이프에 대한 싱글톤 파이프를 작성합니다.
  • 싱글톤 파이프에 캐시할 메시지를 작성합니다.
  • 메시지를 싱글톤 파이프로 보냅니다. 선택적으로 암시적 메시지에 대해 shelflife를 지정합니다.

예외사항

표 - RECEIVE_MESSAGE 함수 예외

예외사항 설명

Null pipe name

권한 오류. 권한이 부족하여 파이프에서 레코드를 제거할 수 없습니다. 파이프는 다른 사람이 소유하고 있습니다.

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 함수 매개변수

매개변수 설명

pipename

메시지를 배치할 파이프의 이름입니다.

명시적 파이프를 사용하는 경우 CREATE_PIPE를 호출할 때 지정한 이름입니다.

주의: 'ORA$'로 시작하는 파이프 이름은 사용하지 마십시오. 이러한 이름은 Oracle에서 제공하는 프로시저에서 사용하도록 예약되어 있습니다. Pipename은 128바이트보다 길지 않아야 하며 대소문자를 구분하지 않습니다. 현재 이름은 Globalization Support 문자를 포함할 수 없습니다.

timeout

파이프에 메시지를 배치하려고 시도하는 동안 기다리는 시간(초)입니다.

기본값은 상수 MAXWAIT이며 86400000(1000일)으로 정의됩니다.

maxpipesize

파이프에 허용되는 최대 크기(바이트).

파이프에 있는 모든 메시지의 총 크기는 이 양을 초과할 수 없습니다. 이 최대값을 초과하면 메시지가 차단됩니다. 기본값은 65536바이트입니다.

파이프의 maxpipesize는 파이프 특성의 일부가 되며 파이프 수명 동안 지속됩니다. 값이 큰 SEND_MESSAGE를 호출하면 maxpipesize가 증가합니다. 값이 작은 호출자는 더 큰 기존 값을 사용합니다.

maxpipesizeSEND_MESSAGE 프로시저의 일부로 지정하면 파이프를 열기 위한 별도의 호출이 필요하지 않습니다. 파이프를 명시적으로 작성한 경우 선택적 maxpipesize 매개변수를 사용하여 작성 파이프 크기 지정을 재지정할 수 있습니다.

모든 파이프에 대해 기본값 maxpipesize 65536을 적용할 수 있습니다.

singleton

TRUE를 사용하여 싱글톤 파이프를 만듭니다.

기본값: FALSE

shelflife

싱글톤 파이프에 캐시된 메시지의 만료 시간(초)입니다.

지정된 shelflife 시간을 초과하면 더 이상 파이프에서 메시지에 액세스할 수 없습니다. shelflife 매개변수는 싱글톤 파이프에만 적용할 수 있습니다.

기본값은 메시지가 만료되지 않도록 하는 0입니다.

반환 값

테이블 - SEND_MESSAGE 함수 반환 값

Return 설명

0

성공.

파이프가 이미 있고 파이프를 만들려는 사용자가 파이프를 사용할 권한이 있는 경우 Oracle은 성공을 나타내는 0을 반환하며 파이프에 이미 있는 모든 데이터는 남아 있습니다.

SYSDBS/SYSOPER로 연결된 사용자가 파이프를 다시 만들면 Oracle은 상태 0을 반환하지만 파이프 소유권은 변경되지 않은 상태로 유지됩니다.

1

시간 초과됨.

이 절차는 파이프에 대한 잠금을 얻을 수 없거나 파이프가 너무 가득 차서 사용할 수 없기 때문에 시간 초과될 수 있습니다. 파이프가 암시적으로 작성되고 비어 있으면 제거됩니다.

3

인터럽트 발생.

파이프가 암시적으로 작성되고 비어 있으면 제거됩니다.

6

기존 파이프를 싱글톤 파이프로 변환하지 못했습니다.

  • 기존 메시지가 두 개 이상 있는 암시적 파이프는 싱글톤 파이프로 변환할 수 없습니다.
  • 싱글톤이 아닌 명시적 파이프의 경우 DBMS_PIPE.SEND_MESSAGE는 싱글톤 인수가 TRUE로 설정된 메시지를 보낼 수 없습니다.

7

shelflife 매개변수에 대해 0이 아닌 값이 제공되며 파이프가 싱글톤 파이프가 아닙니다.

ORA-23322

권한이 없습니다.

이름이 동일한 파이프가 있고 다른 사용자가 만든 경우 Oracle은 이름 지정 충돌을 나타내는 오류 ORA-23322를 표시합니다.

예외사항

테이블 - SEND_MESSAGE 함수 예외

예외사항 설명

Null pipe name

권한 오류. 권한이 부족하여 파이프에 쓸 수 없습니다. 파이프는 개인용이며 다른 사람이 소유합니다.