PL/SQL:DBMS_PIPE包的使用
包DBMS_PIPE用于在同一例程的不同会话之间进行管理通信.Oracle管道(PIPE)类似于UNIX系统的管道,但它不是采用操作系统机制实现的,基管道信息被缓存在SGA中,当关闭例程时会丢失管道信息.在建立管道中,既可以建立公用管道,也可以建立私有管道.其中,公用管道是指所有数据库用户都可以的管道,而私有管道只能由建立管道的数据库用户访问.注意,如果用户要执行包DBMS_PIPE的过程和函数,则必须要为用户授权
如下:
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)时,一个会话需要将消息发送到管道中.而另一个会话则需要接收管道消息.当
发送信息到管道时,需要首先将消息写入本地消息缓冲区,然后将本地消息缓冲区内容发送到管道;
当接收管道消息时,需要首先使用本地消息缓冲区接收消息管道消息,然后从消息缓冲区中取得具体
消息.
转载地址:http://blog.youkuaiyun.com/pmhlove/article/details/8525902