DBMS_PIPE用法

  • A+
所属分类:oracle

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;
/*

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: