没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
使用 oracle pipe 传递消息
减小字体 增大字体
1.管道操作
1.1 管道的通讯机制:
消息发送者把消息发送到本地消息缓冲区,本地消息缓冲区的消息发送到
数据库指定实例的 UGA 区域,消息接收者从数据库管道获取消息并且放到本地
消息缓冲区,然后从本地消息缓冲区读取消息。
由于数据库把管道建立在数据库实例的 UGA 区域,所以管道式可以实现同
一个数据库实例下不同数据库会话之间的通讯的。
注意:管道消息是独立于事务的,也就是说不能回滚得,并且同一个管道
消息只能被一个用户接收。也就是说要实现消息的广播,还需要在管道上的通
讯机制上,自己做进一步的工作。
1 种方式就是采用循环的方式,对需要接收消息的用户按照数据库会话的
方式,一个循环下来对每一个数据库会话都发送一条消息(按照会话内通讯(消
息的寻址)的方式进行处理)。
用户可以定义自己的协议来实现管道消息。参考下面的例子。
内容较多的消息的发送和接收。对于那些需要发送大的消息,应该考虑采
用数据表的方式,通过管道可以发送消息的简要信息,真正的消息内容保存到
一个数据表中去,
当用户通过管道获得消息后,解析消息,然后去相应的数据表获取真正的
消息内容。
1.2 发送消息/接收消息
---发送消息到指定管道
declare
i integer;
j integer;
begin
for j in 1..10loop
dbms_pipe.pack_message('wdz'||j);
end loop;
dbms_pipe.pack_message('end');
i := dbms_pipe.send_message('apple');
if i =0 then
dbms_output.put_line('ok--发送消息成功!');
end if;
end;
---从指定管道接受消息
declare
i integer;
ch varchar2(200);
+ag boolean :=false;
begin
i := dbms_pipe.receive_message('apple',100);
if(i=0)then
dbms_output.put_line('ok---准备接受消息');
else
+ag := true;
end if;
while(not +ag) loop
dbms_pipe.unpack_message(ch);
if(upper(ch)='END') then
+ag := true;
dbms_output.put_line('接收消息完成');
else
dbms_output.put_line('消息内容='||ch);
end if;
end loop;
end;
1.3 使用自己定义的协议发送/接收消息
-- Created on 2003-11-10 by wdz
---发送消息到指定管道
---自己定义的消息协议
---用消息对的方式发送和接收消息。
---消息对的第一个消息作为消息头表明消息对的第 2 个消息的类型。
---消息对的第 2 个消息表明消息对的消息体
--- c 表示消息体为字符型
--- d 表示消息体为日期型
--- n 表示消息体为数字型
declare
i integer;
j integer;
begin
dbms_pipe.pack_message('c');
dbms_pipe.pack_message('消息体为字符型');
dbms_pipe.pack_message('d');
dbms_pipe.pack_message(sysdate);
dbms_pipe.pack_message('n');
dbms_pipe.pack_message(1000);
dbms_pipe.pack_message('end');
i := dbms_pipe.send_message('apple');
if i =0 then
剩余9页未读,继续阅读
资源评论
xtgyto1
- 粉丝: 26
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功