Oracle plsql session间通信处理

本文介绍了Oracle数据库中如何利用DBMS_PIPE包实现在不同会话间的通信。DBMS_PIPE类似于Unix下的管道,可用于异步输出中间结果。文章详细解释了如何创建管道、发送和接收消息的具体步骤。
Oracle中,要实现session间的通信,并不能像C++或java一样直接实现。而要通过dbms_pipe或dbms_alert包实现。
dbms_pipe的概念类似于unix下的管道,可以异步输出中间结果。
dbms_pipe的用途:
我们知道,在plsql执行过程中,如果一个事务正在处理中,是不能获取中间输出的信息的,如:dbms_output的输出。这样的话我们就无法知道这个事务到底处理到了什么步骤。
此时,就可以使用dbms_pipe来实现这样的需求了。由于这个包是用于session间通信的,说明在事务处理过程中,可以将对应的信息打包发送。而另外的session可以根据指定管道的名称来获得这些内容。
发送方具体实现步骤如下:
创建管道:
v_status := create_pipe(pipe_name);
--pipe_name:管道名称
返回结果:0:成功;ora-23322表示对应管道名称已经存在。

打包要发送的消息:
pack_message(msg_content);
--msg_content:要发送的消息内容
可以为varchar2、number、rowid、date、raw、nchar中的一种。

根据指定的管道发送消息:
send_message(pipe_name);
--pipe_name:指定要发送消息的管道的名称
返回结果:0:成功;1:超时;3:中断;ora-23322

接收方具体实现:
receive_message(pipe_name);
--pipe_name:即指定要消息来源的管道的名称;

next_item_type();
--返回接收的消息的数据类型
返回结果:
0:no more items;
6:number;
9:varchar2;
11:rowid;
12:date;
23:raw;

解包:
unpack_message(item);
对应的item的类型要由前面next_item_type所决定。然后输出即可。
另外,在plsql dev上,还可以通过Event monitor工具来观察管道的输出。即可省去手动解包的过程。

dbms_alert也可以实现类似的功能,区别在于dbms_alert需要事务中执行commit后才能发送消息。而且支持的数据格式也只有文本形式,而不能像dbms_pipe可以支持date、rowid等其他类型。

详细内容参考:
http://download.oracle.com/docs/cd/F49540_01/DOC/server.815/a68001/dbms_pip.htm

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12932950/viewspace-620812/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12932950/viewspace-620812/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值