PL/SQL:DBMS_PIPE包的使用

PL/SQL:DBMS_PIPE包的使用

   包DBMS_PIPE用于在同一例程的不同会话之间进行管理通信.ORACLE管道(PIPE)类似于UNIX系统的管道,但它不是采用操作系统机制实现的,基管道信息被缓存在SGA中,当关闭例程时会丢失管道信息.在建立管道中,既可以建立公用管道,也可以建立私有管道.其中,公用管道是指所有数据库用户都可以的管道,而私有管道只能由建立管道的数据库用户访问.注意,如果用户要执行包DBMS_PIPE的过程和函数,则必须要为用户授权

   如下:

 SQL>GRANT EXECUTE ON dbms_pipe TO scott;

   1.CREATE_PIPE
     该函数用于建立公用管道或私有管道.如果将参数private设置为true,则建立私有管道;如果为
  false,则建立公用管道.语法如下:
      DBMS_PIPE.CREATE_PIPE(
       pipename IN VARCHAR2,
       maxpipesize IN INTEGER DEFAULT 8192,
       private IN BOOLEAN DEFAULT TRUE)
      RETURN INTEGER;
     如上所示,pipename用于指定管道的名称,maxpipesize用于指定管道消息的最大尺寸,private用
   于指定管道类型.如果该函数返回0,则表示建立管道成功,否则表示建立管道失败.下面以建立公用   管道public_pipe为

例,说明使用该函数的方法.
 
    2.PACK_MESSAGE
    该过程用于将信息写入到本地消息缓冲区.为了给管道发送信息,首先需要使用过程PACK_MESSAGE
  将消息写入到本地消息缓冲区,然后使用过程SEND_MESSAGE将本地消息缓冲区中的消息发送到管道.
  语法:    DBMS_PIPE.PACK_MESSAGE(item IN VARCHAR2);
           DBMS_PIPE.PACK_MESSAGE(item IN NCHAR);
           DBMS_PIPE.PACK_MESSAGE(item IN NUMBER);
           DBMS_PIPE.PACK_MESSAGE(item IN DATE);
           DBMS_PIPE.PACK_MESSAGE_RAW(item IN RAW);
           DBMS_PIPE.PACK_MESSAGE_ROWID(item IN ROWID);
    如上所示,item用于指定管道消息,其输入值可以是字符,数字,日期等多种数据类型.
   3.SEND_MESSAGE
   该函数用于将本地消息缓冲区中的内容发送到管道.语法如下:
          DBMS_PIPE.SEND_MESSAGE(
            pipename IN VARCHAR2,
            timeout  IN INTEGER DEFAULT MAXWAIT,
            maxpipesize IN INTEGER DEFAULT 8192)
          RETURN INTEGER;
   如上所示,timeout用于指定发送消息的超时时间,如果函数返回0,则表示消息发送成功;如果函数
   返回1,则表示发送消息超时;如果函数返回3,则表示出现中断.
   4.RECEIVE_MESSAGE
   该函数用于接收管道消息,并将接收到的消息写入到本地消息缓冲区.当接收到管道消息之后,会删
  除管道消息.注意,管道消息只能被接收一次.使用该函数的语法如下:
        DBMS_PIPE.RECEIVE_MESSAGE(
         pipename IN VARCHAR2,
         timeout IN INTEGER DEFAULT maxwait)
        RETURN INTEGER;
     如果函数返回0,则表示接收消息成功;如果函数返回1,则表示出现超时;如果函数返回2,则表示
  本地缓冲区不能容纳管道消息;如果函数返回3,则表示发生中断.
   5.NEXT_ITEM_TYPE
    该函数用于确定本地消息缓冲区下一项数据类型,在调用了RECEIVE_MESSAGE之后调用该函数.
        DBMS_PIPE.NEXT_ITEM_TYPE RETURN INTEGER;
    如果该函数返回0,则表示管道没有任何消息;如果返回6,则表示下一项的数据类型为NUMBER,如果
 返回9,则表示下一项的数据类型为VARCHAR2;如果返回11,则表示下一项的数据类型为ROWID;如果返
 回12,则表示下一项的数据类型为DATE,如果返回23,则表示下一项的数据类型为RAW.
   6.UNPACK_MESSAGE
    该过程用于将消息缓冲区中的内容写入到变量中.在使用函数RECEIVE_MESSAGE接收到管道消息之
  后,应该使用过程UNPACK_MESSAGE取得消息缓冲区的消息.语法
     DBMS_PIPE.UNPACK_MESSAGE(item OUT VARCHAR2);
     DBMS_PIPE.UNPACK_MESSAGE(item OUT NCHAR);
     DBMS_PIPE.UNPACK_MESSAGE(item OUT NUMBER);
     DBMS_PIPE.UNPACK_MESSAGE(item OUT DATE);
     DBMS_PIPE.UNPACK_MESSAGE_RAW(item OUT RAW);
     DBMS_PIPE.UNPACK_MESSAGE_ROWID(item OUT ROWID);
   当使用过程UNPACK_MESSAGE取出消息缓冲区的消息时,每次只能取出一条消息.如果要取出多条消
息,则需要多次调用过程UNPACK_MESSAGE.
    7.REMOVE_PIPE
   该函数用于删除已经建立的管道.
      DBMS_PIPE.REMOVE_PIPE(pipename IN VARCHAR2) RETURN INTEGER;
    如果该函数返回0,则表示删除管道成功,否则会显示错误信息.
    8.PURGE
     该过程用于清楚管道中的内容
      DBMS_PIPE.PURGE(pipename IN VARCHAR2);
    9.RESET_BUFFER
     该过程用于复位管道缓冲区.因为所有管道都共享单个管道缓冲区,所以在使用新管道之前应该
  复位管道缓冲区.语法如下:
      DBMS_PIPE.RESET_BUFFER;
    10.UNIQUE_SESSION_NAME
     该函数用于特定会话返回惟一的名称,并且名称的最大长度为30字节.对于同一会话来说,其值
  不会改变.
    11管道使用示例:
    当使用管道(PIPE)时,一个会话需要将消息发送到管道中.而另一个会话则需要接收管道消息.当
 发送信息到管道时,需要首先将消息写入本地消息缓冲区,然后将本地消息缓冲区内容发送到管道;
 当接收管道消息时,需要首先使用本地消息缓冲区接收消息管道消息,然后从消息缓冲区中取得具体
 消息.

    示例一

   create or replace procedure send_message(pipename varchar2,message varchar2) is
    l_flag INT;
   begin
     l_flag:=DBMS_PIPE.create_pipe(pipename);
     IF l_flag=0 then
        DBMS_PIPE.pack_message(message);
        l_flag:=DBMS_PIPE.send_message(pipename,timeout => 5 ); 
     END IF;
   end send_message;

   示例二、

    create or replace procedure receive_message(pipename varchar2,message out varchar2) is
      l_flag int;
    begin
      l_flag:=DBMS_PIPE.receive_message(pipename,timeout => 5);--如果5秒钟没有发出数据就结束
    IF l_flag=0 THEN
       DBMS_PIPE.unpack_message(message);
      l_flag:=DBMS_PIPE.remove_pipe(pipename);
    END IF;
    end receive_message;


   调用:
   会话一

    exec send_message('pi','你好吗?');

会话一


  var message varchar2(100);
    exec receive_message('pi',:message);
    print message;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值