DBMS_PIPE包用于同一个实例,不同会话(用户)之间进行通信。管道的信息被缓存在系统全局区SGA中,当关闭Oracle实例(Instance)时,就会丢失管道信息。
管道分为两类:
(1)公有管道:所有数据库用户都可以访问的管道,因此要想在同一个实例的不同用户之间建立管道,要使用公有管道。
(2)私有管道:只能由建立管道的数据库用户访问。
管道发送方:
(1)创建管道 create_pipe
语法:
DBMS_PIPE.create_pipe(pipename in varchar2, maxpipesize in integer default 8192, private in boolean default TRUE) return integer;
(2)写信息到本地缓存区 pack_message(打包)
语法:
DBMS_PIPE.pack_message(message in {varchar2, number, date});
(3)将本地缓存区中的消息 发送到 管道pipename 中 send_message
语法:
1 DBMS_PIPE.send_message(pipename in varchar2, 2 timeout in integer default MAXWAIT, 3 maxpipesize in integer default 8192) 4 return integer;
管道接收方:
(1)从管道接收消息,写入本地缓冲区中 receive_message
语法:
1 DBMS_PIPE.receive_message(pipename in varchar2, 2 timeout in integer default MAXWAIT) 3 return integer;
(2)读取缓冲区的数据 UNPACK_MESSAGE(拆包)
语法:
DBMS_PIPE.unpack_message(message out varchar2, number, date);
(3)删除管道 remove_pipe
语法:
1 DBMS_PIPE.remove_pipe(pipename in varchar2) 2 return integer;
1 --发送消息管道 2 create or replace procedure send_message_pipe(pipename varchar2, 3 message varchar2) is 4 --variable 5 flag integer; 6 7 begin 8 --创建管道 9 flag := DBMS_PIPE.create_pipe(pipename); 10 if flag = 0 then 11 DBMS_PIPE.pack_message(message); --将消息写到本地缓冲区(打包) 12 flag := DBMS_PIPE.send_message(pipename); --将本地缓冲区的消息发送到管道 13 end if; 14 end send_message_pipe;
--接收消息管道
1 create or replace procedure receive_message_pipe(pipename varchar2, 2 message out varchar2) 3 is 4 5 --variable 6 flag integer; 7 begin 8 --接收管道消息,到本地缓冲区中 9 flag := DBMS_PIPE.receive_message(pipename); 10 if flag = 0 then 11 DBMS_PIPE.unpack_message(message); --从缓冲区中读取消息(拆包) 12 flag := DBMS_PIPE.remove_pipe(pipename); --移除管道 13 end if; 14 end receive_message_pipe;