DBMS_PIPE

DBMS_PIPE内置包用于在连接到相同数据库集群的会话内部或者会话之间传递消息。

注意事项

DBMS_PIPE不建议集群地址使用,可能引起长事务问题。

DBMS_PIPE子程序总览

子程序

说明

CREATE_PIPE Function

创建一个命名管道。

NEXT_ITER_TYPE Function

返回缓冲区中下一个数据成员的数据类型。

PACK_MESSAGE Procedures

将一个数据项放入会话的本地消息缓冲区中。

UNPACK_MESSAGE Procedures

访问缓冲区中的下一个数据项。

PURGE Procedure

清除命名管道中的内容。

RECEIVE_MESSAGE Function

将命名管道中的消息复制到本地缓冲区。

REMOVE_PIPE Function

删除一个命名管道。

RESET_BUFFER Procedure

清除本地缓冲区中的内容。

SEND_MESSAGE Function

向命名管道发送消息。

UNIQUE_SESSION_NAME Function

返回当前会话的唯一名称。

CREATE_PIPE Function

该函数用于创建一个命名管道。

语法

DBMS_PIPE.CREATE_PIPE (
   pipename     IN VARCHAR2,
   maxpipesize  IN INTEGER DEFAULT 8192,
   private      IN BOOLEAN DEFAULT TRUE)
RETURN INTEGER;

参数说明

参数

说明

pipename

管道的名称。

maxpipesize

(可选参数)管道的最大容量,以字节为单位。默认值为8192字节。

private

(可选参数)是否创建为私有管道。取值如下:

  • TRUE(默认):创建为私有管道。

  • FALSE:不创建为私有管道。

返回值

返回值

说明

INTEGER

创建管道操作返回的状态代码。0表示成功创建。

示例

该示例展示了如何创建一个命名管道。

DECLARE
    status        INTEGER;
BEGIN
    status := DBMS_PIPE.CREATE_PIPE('messages');
    DBMS_OUTPUT.PUT_LINE('CREATE_PIPE status: ' || status);
END;

NEXT_ITER_TYPE Function

该函数用于返回缓冲区中下一个数据成员的数据类型。

语法

DBMS_PIPE.NEXT_ITEM_TYPE() RETURN INTEGER; 

返回值

返回值

说明

INTEGER

缓冲区中下一个数据成员的数据类型。

示例

该示例展示了如何获取缓冲区的下一个数据成员的类型。示例中创建了两个会话,其中一个用于向管道发送消息,另一个会话接收消息。

SESSION A:

DECLARE
    str       VARCHAR2 := 'Character data';
    status    INTEGER;
BEGIN
    DBMS_PIPE.PACK_MESSAGE(str);

    -- SEND_MESSAGE status is: 0
    status := DBMS_PIPE.SEND_MESSAGE('messages');
    DBMS_OUTPUT.PUT_LINE('SEND_MESSAGE status is: ' || status);
END;

SESSION B:

DECLARE
    str      VARCHAR2;
    status   INTEGER;
BEGIN
    status := DBMS_PIPE.RECEIVE_MESSAGE('messages');
    
    -- RECEIVE_MESSAGE status is: 0
    DBMS_OUTPUT.PUT_LINE('RECEIVE_MESSAGE status is: ' || status);
    
    -- NEXT_ITEM_TYPE is: 9
    status := DBMS_PIPE.NEXT_ITEM_TYPE;
    DBMS_OUTPUT.PUT_LINE('NEXT_ITEM_TYPE is: ' || status);

    -- VARCHAR2 Item is: Character data
    DBMS_PIPE.UNPACK_MESSAGE(str);
    DBMS_OUTPUT.PUT_LINE('VARCHAR2 Item is: ' || str);
END;

PACK_MESSAGE Procedures

该存储过程用于将数据项打包至消息缓冲区中。

语法

DBMS_PIPE.PACK_MESSAGE (
   item  IN  VARCHAR2);

DBMS_PIPE.PACK_MESSAGE (
   item  IN  NUMBER);

DBMS_PIPE.PACK_MESSAGE (
   item  IN  DATE);

DBMS_PIPE.PACK_MESSAGE_RAW (
   item  IN  RAW);

参数说明

参数

说明

item

待打包到本地消息缓冲区的数据项。

示例

该示例展示了如何通过该存储过程发送不同类型的消息。

说明

该部分只是消息发送的部分,消息接收的部分可以查看UNPACK_MESSAGE的示例。

DECLARE
    str      VARCHAR2 := 'Character data';
    num      NUMBER := '1024';
    status   INTEGER;
BEGIN
    DBMS_PIPE.PACK_MESSAGE(str);
    DBMS_PIPE.PACK_MESSAGE(num);
    
    -- send message
    status := DBMS_PIPE.SEND_MESSAGE('messages');
END;

UNPACK_MESSAGE Procedures

该存储过程用于访问缓冲区中的下一个数据项。

语法

DBMS_PIPE.UNPACK_MESSAGE (
   item  OUT  VARCHAR2);

DBMS_PIPE.UNPACK_MESSAGE (
   item  OUT  NUMBER);

DBMS_PIPE.UNPACK_MESSAGE (
   item  OUT  DATE);

DBMS_PIPE.UNPACK_MESSAGE_RAW (
   item  OUT  RAW);

参数说明

参数

说明

item

从本地消息缓冲区获取数据项。

示例

该示例展示了如何接收管道中的消息。

DECLARE
    str      VARCHAR2;
    num      NUMBER;
    status   INTEGER;
BEGIN
    -- RECEIVE_MESSAGE status is: 0  
    status := DBMS_PIPE.RECEIVE_MESSAGE('messages');
    DBMS_OUTPUT.PUT_LINE('RECEIVE_MESSAGE status is: ' || status);

    -- VARCHAR2 item is: Character data
    DBMS_PIPE.UNPACK_MESSAGE(str);
    DBMS_OUTPUT.PUT_LINE('VARCHAR2 item is: ' || str);

    -- NUMBER item is: 1024
    DBMS_PIPE.UNPACK_MESSAGE(num);
    DBMS_OUTPUT.PUT_LINE('NUMBER item is: ' || num);
END;

PURGE Procedure

该存储过程用于清除命名管道以及接收缓冲区中的内容。

语法

DBMS_PIPE.PURGE (
   pipename  IN  VARCHAR2);

参数说明

参数

说明

pipename

目标管道的名称

示例

该示例展示了如何清除命名管道中的内容。

CALL DBMS_PIPE.PURGE('messages');

RECEIVE_MESSAGE Function

该函数用于将命名管道中的消息复制到本地缓冲区。

语法

DBMS_PIPE.RECEIVE_MESSAGE (
   pipename     IN VARCHAR2,
   timeout      IN INTEGER DEFAULT 86400)
RETURN INTEGER;

参数说明

参数

说明

pipename

目标管道的名称。

timeout

(可选参数)等待消息的超时时间,单位为秒。默认值是86400。

返回值

返回值

说明

INTEGER

调用结果的状态码。

示例

该示例展示了如何复制管道中的消息到缓冲区。

DECLARE
    varchar       VARCHAR2 := 'Character data';
    status        INTEGER;
    result        VARCHAR2;
    idx           INTEGER;
BEGIN
    DBMS_PIPE.PACK_MESSAGE(varchar);
    DBMS_PIPE.PACK_MESSAGE(varchar);
    DBMS_PIPE.PACK_MESSAGE(varchar);
    
    -- SEND_MESSAGE status is: 0
    status := DBMS_PIPE.SEND_MESSAGE('messages');
    DBMS_OUTPUT.PUT_LINE('SEND_MESSAGE status is: ' || status);
    
    status := DBMS_PIPE.RECEIVE_MESSAGE('messages');

    -- Character data
    -- Character data
    -- Character data
    FOR idx in 1..3 LOOP
      DBMS_PIPE.UNPACK_MESSAGE(result);
      DBMS_OUTPUT.PUT_LINE(result);
    END LOOP;
END;

REMOVE_PIPE Function

该函数用于删除一个命名管道。

语法

DBMS_PIPE.REMOVE_PIPE (
   pipename  IN  VARCHAR2)
RETURN INTEGER;

参数说明

参数

说明

pipename

目标管道名称。

返回值

返回值

说明

INTEGER

调用结果的状态码。

示例

该示例展示了如何删除一个命名管道。

SELECT DBMS_PIPE.REMOVE_PIPE('messages') FROM DUAL;
 remove_pipe 
-------------
           0
(1 row)

RESET_BUFFER Procedure

该存储过程用于清除发送缓冲区中的内容。

语法

DBMS_PIPE.RESET_BUFFER; 

示例

该示例展示了如何清除本地缓冲区的内容。

CALL DBMS_PIPE.RESET_BUFFER;

SEND_MESSAGE Function

该函数用于向命名管道发送消息。

语法

DBMS_PIPE.SEND_MESSAGE (
    pipename     IN VARCHAR2,
    timeout      IN INTEGER DEFAULT 86400,
    maxpipesize  IN INTEGER DEFAULT 8192)
  RETURN INTEGER;

参数说明

参数

说明

pipename

管道名称

timeout

(可选参数)等待时间,单位为秒。默认值是86400。

maxpipesize

(可选参数)管道的最大容量,以字节为单位。默认值为8192字节。

返回值

返回值

说明

INTEGER

调用结果的状态码。

示例

该示例用于展示如何将本地的数据发送到管道。

DECLARE
    varchar       VARCHAR2 := 'Character data';
    status        INTEGER;
    result        VARCHAR2;
    idx           INTEGER;
BEGIN
    DBMS_PIPE.PACK_MESSAGE(varchar);
    DBMS_PIPE.PACK_MESSAGE(varchar);
    DBMS_PIPE.PACK_MESSAGE(varchar);
    
    -- SEND_MESSAGE status is: 0
    status := DBMS_PIPE.SEND_MESSAGE('messages');
    DBMS_OUTPUT.PUT_LINE('SEND_MESSAGE status is: ' || status);
    
    status := DBMS_PIPE.RECEIVE_MESSAGE('messages');

    -- Character data
    -- Character data
    -- Character data
    FOR idx in 1..3 LOOP
      DBMS_PIPE.UNPACK_MESSAGE(result);
      DBMS_OUTPUT.PUT_LINE(result);
    END LOOP;
END;

UNIQUE_SESSION_NAME Function

该函数用于返回当前会话的唯一名称。

语法

DBMS_PIPE.UNIQUE_SESSION_NAME 
  RETURN VARCHAR2;

返回值

返回值

说明

VARCHAR2

当前会话的唯一名称。

示例

该示例用于展示如何获取当前会话的唯一名称。

SELECT DBMS_PIPE.UNIQUE_SESSION_NAME() FROM dual;
  unique_session_name  
-----------------------
 POLARDB$PIPE$12$57884
(1 row)