RECEIVEPIPE

说明

此函数用于将管道中接收消息放到本地接收缓冲区中

语法

receivepipe ::=

参数

pipename

管道的名称

timeoutwait

超时等待时间

返回值

接收消息成功返回0,超时等待退出会返回1,失败会报错。

注解

接收管道消息时,管道名称和超时等待时间参数传入NULL会报错。

除创建者和管理员其他用户没有接收私有管道消息的权限。

RECEIVEPIPE函数提供对DBMS.RECEIVE_MESSAGE方法的实现,该方法的详细说明请参照 RECEIVE_MESSAGE 章节。

示例

-- 清理环境
drop procedure mysendpipe cascade;
drop procedure myreceivepipe cascade;
select removepipe('mypipe');
REMOVEPIPE(int)      |
---------------------
0                    |
总数目:1

-- 发送消息程序,此程序需要调用dbms_pipe.pack_message方法构建消息。
create procedure mysendpipe() is
declare
    statpipe int;
    mytext varchar2(100):='This is a text string';
    mydate date := to_date('2017-05-05');
    mynum  number := 109;
begin
    statpipe := createpipe('mypipe',8192,FALSE);
    dbms_pipe.pack_message(mytext);
    dbms_pipe.pack_message(mydate);
    dbms_pipe.pack_message(mynum);
    statpipe := sendpipe('mypipe',10,8192);
    if statpipe = 0 then
        dbms_output.put_line('send message success');
    else
        dbms_output.put_line('send message fail');
end if;
end;
/

-- 接收消息程序,此程序需要调用dbms_pipe.unpack_message方法取出消息,并调用dbms_pipe.next_item_type确定下一条消息内容。
create or replace procedure myreceivepipe() is
declare
    statpipe int;
    flag int;
    mytext varchar2(100);
    mydate date;
    mynum number;
begin
    statpipe := receivepipe('mypipe',10);
    loop
        flag := dbms_pipe.next_item_type;
        if flag = 0 then
            exit;
        elsif flag = 6 then
            dbms_pipe.unpack_message(mynum);
        elsif flag = 9 then
            dbms_pipe.unpack_message(mytext);
        elsif flag = 12 then
            dbms_pipe.unpack_message(mydate);
        end if;
    end loop;
    dbms_output.put_line(mydate);
    dbms_output.put_line(mynum);
    dbms_output.put_line(mytext);
end;

/

exec mysendpipe();


exec myreceivepipe();


select removepipe('mypipe');
REMOVEPIPE(int)      |
---------------------
0                    |
总数目:1

drop procedure mysendpipe;
drop procedure myreceivepipe;