DBMS_PIPE 模块
DBMS_PIPE 模块提供一组例程,用于通过管道在连接至同一 例程中数据库的会话中或会话间发送消息。
此模块的模式为 SYSIBMADM。
DBMS_PIPE 模块包括以下内置例程。
| 例程名称 | 描述 |
|---|---|
| CREATE_PIPE 函数 | 显式创建专用或公用管道。 |
| NEXT_ITEM_TYPE 函数 | 确定所接收消息中的下一项的数据类型。 |
| PACK_MESSAGE 函数 | 将某项放在会话的本地消息缓冲区中。 |
| PACK_MESSAGE_RAW 过程 | 将类型为 RAW 的项放在会话的本地消息缓冲区中。 |
| PURGE 过程 | 除去指定管道中未接收到的消息。 |
| RECEIVE_MESSAGE 函数 | 从指定的管道中获取消息。 |
| REMOVE_PIPE 函数 | 删除显式创建的管道。 |
| RESET_BUFFER 过程 | 重置本地消息缓冲区。 |
| SEND_MESSAGE 过程 | 在指定的管道上发送消息。 |
| UNIQUE_SESSION_NAME 函数 | 返回唯一会话名称。 |
| UNPACK_MESSAGE 过程 | 从消息中检索下一数据项并将其指定给变量。 |
使用说明
管道是在过程调用期间隐式或显式创建的。隐式管道是在过程调用包含对不存在的管道名称的引用时创建的。例如,如果管道“mailbox”被传递至 SEND_MESSAGE 过程,并且该管道尚未存在,那么会创建新管道“mailbox”。显式管道是通过调用 CREATE_PIPE 函数并指定管道名称创建的。
管道可以是专用管道或公用管道。专用管道只能由创建该管道的用户访问。甚至管理员也不能访问另一用户创建的专用管道。公用管道可由对 DBMS_PIPE 模块具有访问权的任何用户访问。要对管道指定访问级别,请使用 CREATE_PIPE 函数并指定 private 参数的值:“false”指定该管道为公用管道,“true”指定该管道为专用管道。如果未指定任何值,那么缺省值是创建专用管道。所有隐式管道都是公共管道。
要通过管道发送消息,请调用 PACK_MESSAGE 函数以将个别数据项(行)放入到当前会话独有的本地消息缓冲区中。然后,调用 SEND_MESSAGE 过程以通过管道发送消息。
要接收消息,请调用 RECEIVE_MESSAGE 函数以从指定管道获取消息。该消息将写至接收会话的本地消息缓冲区。然后,调用 UNPACK_MESSAGE 过程以从本地消息缓冲区检索下一数据项并将其指定给指定的程序变量。如果管道包含多个消息,那么 RECEIVE_MESSAGE 函数会以 FIFO(先进先出)顺序获取消息。
每个会话保留单独的消息缓冲区,以保存 PACK_MESSAGE 函数创建的消息及 RECEIVE_MESSAGE 函数检索的消息。单独的消息缓冲区允许您在同一会话中构建和接收消息。但是,对 RECEIVE_MESSAGE 函数进行连续调用时,只有来自最后一个 RECEIVE_MESSAGE 调用的消息才会保存在本地消息缓冲区中。
示例
在连接 1 中,创建名为 pipe1 的管道。将消息放在会话的本地消息缓冲区中并通过 pipe1 发送该消息。
BEGIN
DECLARE status INT;
SET status = DBMS_PIPE.CREATE_PIPE( 'pipe1' );
SET status = DBMS_PIPE.PACK_MESSAGE('message1');
SET status = DBMS_PIPE.SEND_MESSAGE( 'pipe1' );
END@
在连接 2 中,接收消息,对其解包,然后将其显示至标准输出。
SET SERVEROUTPUT ON@
BEGIN
DECLARE status INT;
DECLARE int1 INTEGER;
DECLARE date1 DATE;
DECLARE raw1 BLOB(100);
DECLARE varchar1 VARCHAR(100);
DECLARE itemType INTEGER;
SET status = DBMS_PIPE.RECEIVE_MESSAGE( 'pipe1' );
IF( status = 0 ) THEN
SET itemType = DBMS_PIPE.NEXT_ITEM_TYPE();
CASE itemType
WHEN 6 THEN
CALL DBMS_PIPE.UNPACK_MESSAGE_INT( int1 );
CALL DBMS_OUTPUT.PUT_LINE( 'int1: ' || int1 );
WHEN 9 THEN
CALL DBMS_PIPE.UNPACK_MESSAGE_CHAR( varchar1 );
CALL DBMS_OUTPUT.PUT_LINE( 'varchar1: ' || varchar1 );
WHEN 12 THEN
CALL DBMS_PIPE.UNPACK_MESSAGE_DATE( date1 );
CALL DBMS_OUTPUT.PUT_LINE( 'date1:' || date1 );
WHEN 23 THEN
CALL DBMS_PIPE.UNPACK_MESSAGE_RAW( raw1 );
CALL DBMS_OUTPUT.PUT_LINE( 'raw1: ' || VARCHAR(raw1) );
ELSE
CALL DBMS_OUTPUT.PUT_LINE( 'Unexpected value' );
END CASE;
END IF;
SET status = DBMS_PIPE.REMOVE_PIPE( 'pipe1' );
END@
此示例生成以下输出:
varchar1: message1