ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle plsql session间通信处理

Oracle plsql session间通信处理

原创 Linux操作系统 作者:regonly1 时间:2009-11-27 13:12:56 0 删除 编辑
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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-05-10

  • 博文量
    257
  • 访问量
    1070052