您的位置:首页 > 数据库

PL/SQL:DBMS_PIPE包的使用

2013-01-21 18:29 375 查看
PL/SQL:DBMS_PIPE包的使用

 包DBMS_PIPE用于在同一例程的不同会话之间进行管理通信.ORACLE管道(PIPE)类似于UNIX系统的管道,但它不是采用操作系统机制实现的,基管道信息被缓存在SGA中,当关闭例程时会丢失管道信息.在建立管道中,既可以建立公用管道,也可以建立私有管道.其中,公用管道是指所有数据库用户都可以的管道,而私有管道只能由建立管道的数据库用户访问.注意,如果用户要执行包DBMS_PIPE的过程和函数,则必须要为用户授权

如下:

 SQL>GRANT EXECUTE ON dbms_pipe TO scott;

1.CREATE_PIPE

该函数用于建立公用管道或私有管道.如果将参数private设置为true,则建立私有管道;如果为

false,则建立公用管道.语法如下:

DBMS_PIPE.CREATE_PIPE(

pipename IN VARCHAR2,

maxpipesize IN INTEGER DEFAULT 8192,

private IN BOOLEAN DEFAULT TRUE)

RETURN INTEGER;

如上所示,pipename用于指定管道的名称,maxpipesize用于指定管道消息的最大尺寸,private用

于指定管道类型.如果该函数返回0,则表示建立管道成功,否则表示建立管道失败.下面以建立公用 管道public_pipe为

例,说明使用该函数的方法.

2.PACK_MESSAGE

该过程用于将信息写入到本地消息缓冲区.为了给管道发送信息,首先需要使用过程PACK_MESSAGE

将消息写入到本地消息缓冲区,然后使用过程SEND_MESSAGE将本地消息缓冲区中的消息发送到管道.

语法: DBMS_PIPE.PACK_MESSAGE(item IN VARCHAR2);

DBMS_PIPE.PACK_MESSAGE(item IN NCHAR);

DBMS_PIPE.PACK_MESSAGE(item IN NUMBER);

DBMS_PIPE.PACK_MESSAGE(item IN DATE);

DBMS_PIPE.PACK_MESSAGE_RAW(item IN RAW);

DBMS_PIPE.PACK_MESSAGE_ROWID(item IN ROWID);

如上所示,item用于指定管道消息,其输入值可以是字符,数字,日期等多种数据类型.

3.SEND_MESSAGE

该函数用于将本地消息缓冲区中的内容发送到管道.语法如下:

DBMS_PIPE.SEND_MESSAGE(

pipename IN VARCHAR2,

timeout IN INTEGER DEFAULT MAXWAIT,

maxpipesize IN INTEGER DEFAULT 8192)

RETURN INTEGER;

如上所示,timeout用于指定发送消息的超时时间,如果函数返回0,则表示消息发送成功;如果函数

返回1,则表示发送消息超时;如果函数返回3,则表示出现中断.

4.RECEIVE_MESSAGE

该函数用于接收管道消息,并将接收到的消息写入到本地消息缓冲区.当接收到管道消息之后,会删

除管道消息.注意,管道消息只能被接收一次.使用该函数的语法如下:

DBMS_PIPE.RECEIVE_MESSAGE(

pipename IN VARCHAR2,

timeout IN INTEGER DEFAULT maxwait)

RETURN INTEGER;

如果函数返回0,则表示接收消息成功;如果函数返回1,则表示出现超时;如果函数返回2,则表示

本地缓冲区不能容纳管道消息;如果函数返回3,则表示发生中断.

5.NEXT_ITEM_TYPE

该函数用于确定本地消息缓冲区下一项数据类型,在调用了RECEIVE_MESSAGE之后调用该函数.

DBMS_PIPE.NEXT_ITEM_TYPE RETURN INTEGER;

如果该函数返回0,则表示管道没有任何消息;如果返回6,则表示下一项的数据类型为NUMBER,如果

返回9,则表示下一项的数据类型为VARCHAR2;如果返回11,则表示下一项的数据类型为ROWID;如果返

回12,则表示下一项的数据类型为DATE,如果返回23,则表示下一项的数据类型为RAW.

6.UNPACK_MESSAGE

该过程用于将消息缓冲区中的内容写入到变量中.在使用函数RECEIVE_MESSAGE接收到管道消息之

后,应该使用过程UNPACK_MESSAGE取得消息缓冲区的消息.语法

DBMS_PIPE.UNPACK_MESSAGE(item OUT VARCHAR2);

DBMS_PIPE.UNPACK_MESSAGE(item OUT NCHAR);

DBMS_PIPE.UNPACK_MESSAGE(item OUT NUMBER);

DBMS_PIPE.UNPACK_MESSAGE(item OUT DATE);

DBMS_PIPE.UNPACK_MESSAGE_RAW(item OUT RAW);

DBMS_PIPE.UNPACK_MESSAGE_ROWID(item OUT ROWID);

当使用过程UNPACK_MESSAGE取出消息缓冲区的消息时,每次只能取出一条消息.如果要取出多条消

息,则需要多次调用过程UNPACK_MESSAGE.

7.REMOVE_PIPE

该函数用于删除已经建立的管道.

DBMS_PIPE.REMOVE_PIPE(pipename IN VARCHAR2) RETURN INTEGER;

如果该函数返回0,则表示删除管道成功,否则会显示错误信息.

8.PURGE

该过程用于清楚管道中的内容

DBMS_PIPE.PURGE(pipename IN VARCHAR2);

9.RESET_BUFFER

该过程用于复位管道缓冲区.因为所有管道都共享单个管道缓冲区,所以在使用新管道之前应该

复位管道缓冲区.语法如下:

DBMS_PIPE.RESET_BUFFER;

10.UNIQUE_SESSION_NAME

该函数用于特定会话返回惟一的名称,并且名称的最大长度为30字节.对于同一会话来说,其值

不会改变.

11管道使用示例:

当使用管道(PIPE)时,一个会话需要将消息发送到管道中.而另一个会话则需要接收管道消息.当

发送信息到管道时,需要首先将消息写入本地消息缓冲区,然后将本地消息缓冲区内容发送到管道;

当接收管道消息时,需要首先使用本地消息缓冲区接收消息管道消息,然后从消息缓冲区中取得具体

消息.

示例一

create or replace procedure send_message(pipename varchar2,message varchar2) is
l_flag INT;
begin
l_flag:=DBMS_PIPE.create_pipe(pipename);
IF l_flag=0 then
DBMS_PIPE.pack_message(message);
l_flag:=DBMS_PIPE.send_message(pipename,timeout => 5 );
END IF;
end send_message;

示例二、

create or replace procedure receive_message(pipename varchar2,message out varchar2) is
l_flag int;
begin
l_flag:=DBMS_PIPE.receive_message(pipename,timeout => 5);--如果5秒钟没有发出数据就结束
IF l_flag=0 THEN
DBMS_PIPE.unpack_message(message);
l_flag:=DBMS_PIPE.remove_pipe(pipename);
END IF;
end receive_message;


调用:

会话一

exec send_message('pi','你好吗?');

会话一

var message varchar2(100);
exec receive_message('pi',:message);
print message;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: