您可以使用包DBMS_PIPE通过一个管道在连接到相同数据库集群的会话内部或者会话之间来传递消息。

下面的表列出了在包DBMS_PIPE中允许使用的存储过程和函数。

表 1. DBMS PIPE Functions/Procedures
Function/Procedure Return Type Description
CREATE PIPE(pipename [, maxpipesize ] [, private ]) INTEGER Explicitly create a private pipe if private is "true" (the default) or a public pipe if private is "false".
NEXT ITEM TYPE INTEGER Determine the data type of the next item in a received message.
PACK MESSAGE(item) n/a Place item in the session's local message buffer.
PURGE(pipename) n/a Remove unreceived messages from the specified pipe.
RECEIVE MESSAGE(pipename [, timeout ]) INTEGER Get a message from a specified pipe.
REMOVE PIPE(pipename) INTEGER Delete an explicitly created pipe.
RESET BUFFER n/a Reset the local message buffer.
SEND MESSAGE(pipename [, timeout ] [, maxpipesize ]) INTEGER Send a message on a pipe.
UNIQUE SESSION NAME VARCHAR2 Obtain a unique session name.
UNPACK MESSAGE(item OUT) n/a Retrieve the next data item from a message into a type-compatible variable, item.

管道分为显式创建和隐式创建这两种。如果引用一个先前没有由函数CREATE_PIPE创建的管道名称,那么就会隐式地创建一个管道。例如:如果在执行函数SEND_MESSAGE时使用了一个不存在的管道名称,那么就用这个名称隐式地创建一个管道。通过使用函数CREATE_PIPE,并将这个函数的第一个参数指定为新管道的名称,您可以显式地创建一个管道。

您也可以把管道分成私有和公有这两种。只有创建管道的用户才能访问一个私有管道,甚至超级用户都不能访问由其它用户创建的管道。而任何能够访问包DBMS_PIPE的用户都可以访问一个公有管道。

通过将第三个参数设置为”false”,您可以使用函数CREATE_PIPE创建一个公有管道。而如果把函数CREATE_PIPE的第三个参数设置为”true”或者省略这个参数,您就可以创建一个私有管道 。所有隐式创建的管道都是私有的。

第一次在本地消息缓冲区创建的单独数据项或者消息文本行,对于当前会话来说是唯一的。您使用存储过程PACK_MESSAGE在会话的本地消息缓冲区中创建消息,使用函数SEND_MESSAGE通过管道发送消息。

而消息的接收则涉及到了相反的操作顺序,您首先使用函数RECEIVE_MESSAGE从指定的管道中获得消息,把消息写到会话的本地缓冲区中。然后您使用存储过程UNPACK_MESSAGE将消息的数据成员从消息缓冲区中传递到程序变量。如果管道包含多条消息,那么函数RECEIVE_MESSAGE以先进先出的顺序接收消息。

对于存储过程PACK_MESSAGE创建的消息和函数RECEIVE_MESSAGE获取的消息来说,每一个会话为这两种消息分别保持各自不同的消息缓冲区。这样,您可以在相同的会话中创建和接收消息。然而,如果连续执行函数RECEIVE_MESSAGE, 那么只有最后一次执行函数RECEIVE_MESSAGE所获取的消息保留在本地消息缓冲区中。

CREATE_PIPE

函数CREATE_PIPE使用指定的名称显式地创建了一个公有或私有的管道。

status INTEGER CREATE_PIPE(pipename VARCHAR2
  [, maxpipesize INTEGER ] [, private BOOLEAN ])

参数

参数名称 描述
pipename 管道的名称。
maxpipesize 管道的最大容量,以字节为单位。缺省值是8192字节。
private 如果创建公有管道,那么把这个参数设置为“false”。如果创建一个私有管道,那么把这个参数设定为“true”(这是默认情况)。
status 创建管道的操作返回的状态代码。0表示成功创建。

示例

创建一个名称为messages的私有管道:

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

下列示例创建了一个名为mailbox的公有管道:

DECLARE
    v_status        INTEGER;
BEGIN
    v_status := DBMS_PIPE.CREATE_PIPE('mailbox',8192,FALSE);
    DBMS_OUTPUT.PUT_LINE('CREATE_PIPE status: ' || v_status);
END;
CREATE_PIPE status: 0

NEXT_ITEM_TYPE

函数NEXT_ITEM_TYPE返回一个整数型代码,用于标识消息中下一个数据成员的数据类型,其中,消息应已经送到会话的本地缓冲区中。当您使用存储过程UNPACK_MESSAGE从本地消息缓冲 区移出每一个数据成员时,函数NEXT_ITEM_TYPE将返回下一个成员的数据类型代码。当在消息中没有成员的时候,将返回代码。

typecode INTEGER NEXT_ITEM_TYPE

参数

参数名称 描述
typecode 如表表 2所示,这是一个代码,用于标识消息中下一个数据项的数据类型。
表 2. NEXT_ITEM_TYPE Data Type Codes
Type Code Data Type
0 No more data items
9 NUMBER
11 VARCHAR2
13 DATE
23 RAW