- A+
dbms_pipe是在两个回话之间传递消息的服务程序。可以通过隐式和显示的定义管道。
工作原理
发送
每一个回话都有一个本地消息缓存(local message buffer),发送方首先通过函数PACK_MESSAGE函数将要发送的内容发送到本地消息缓存中。当调用函数SEND_MESSAGE时(调用改函数时候会指定管道名称),改函数将本地消息缓存中所有的内容全部发送出去。同时缓存中内容被清空了。打包函数会为每一个消息增加4字节的头,一个字节表示数据类型,两个字节表示消息长度,还有一个字节表示消息的结束。
接收
先调用函数RECEIVE_MESSAGE进行接收。将管道中的数据放到了本地消息缓存中,然后用UNPACK_MESSAGE函数解包。
我理解就是在管道中存放着一个个的包,每一个包都有包头,由函数PACK_MESSAGE完成,接受时候也是一个一个的接受,一个包一个包的解。
一个例子
/* Formatted on 2008/07/04 14:43 (Formatter Plus v4.8.7) */
DECLARE
i INTEGER;
j INTEGER;
BEGIN
FOR j IN 1 .. 10
LOOP
DBMS_PIPE.pack_message ('wdz' || j);
END LOOP;
DBMS_PIPE.pack_message ('end');
j:=DBMS_PIPE.send_message ('a');
i := DBMS_PIPE.send_message ('apple');
IF i = 0
THEN
DBMS_OUTPUT.put_line ('ok--send OK!');
END IF;
END;
/
/* Formatted on 2008/07/04 14:42 (Formatter Plus v4.8.7) */
DECLARE
i INTEGER;
ch VARCHAR2 (200);
flag BOOLEAN := FALSE;
BEGIN
i := DBMS_PIPE.receive_message ('apple', 100);
IF (i = 0)
THEN
DBMS_OUTPUT.put_line ('ok---prepeare recive message');
ELSE
flag := TRUE;
END IF;
WHILE (NOT flag)
LOOP
DBMS_PIPE.unpack_message (ch);
IF (UPPER (ch) = 'END')
THEN
flag := TRUE;
DBMS_OUTPUT.put_line ('recive OK');
ELSE
DBMS_OUTPUT.put_line ('message is =' || ch);
END IF;
END LOOP;
END;
/*
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫