• oracle系统包——DBMS_PIPE用法


    DBMS_PIPE包用于在同一例程(实例)的不同会话之间进行通信;注意,如果用户要执行包dbms_pipe中的过程和函数,则必须要为用户授权。

    sql>conn sys/oracle as sysdba;
    sql>grant execute on dbms_pipe to scott;
     

    一、管道:
    1)、公有管道:所有数据库用户可访问。
    2)、私有管道:只能建立管道的数据库用户可访问。

    二、DBMS_PIPE包的过程和函数解析
    CREATE_PIPE:用于建立公用管道或私有管道。如果将参数private设置为TRUE,则建立私有管道;如果设置为FALSE,则建立公用管道。
    eg:   

    declare
       falg int;
    begin
       flag:=dbms_pipe.create_pipe('public_pipe',8192,false);
       if flag=0 then
          dbms_output.put_line('建立公用管道成功');
       end if;
    end;
    /
     

    PACK_MESSAGE:用于将消息写入到本地消息缓冲区
    SEND_MESSAGE:用于将本地消息缓冲区中的内容发送到管道
    RECEIVE_MESSAGE:用于接收管道消息
    NEXT_ITEM_TYPE:用于确定本地消息缓冲区下一项的数据类型。
    如果该函数返回0,则表示管道没有任何消息;
    如果返回6,则表示下一项的数据类型为number;
    如果返回9,则表示下一项的数据类型为varchar2;
    如果返回11,则表示下一项的数据类型为rowid;
    如果返回12,则表示下一项的数据类型为date;
    如果返回23,则表示下一项的数据类型为raw.
    UNPACK_MESSAGE:用于将消息缓冲区的内容写入到变量中.
    REMOVE_PIPE:用于删除已经建立的管道
    PUGER:用于清除管道中的内容
    RESET_BUFFER:用于复位管道缓冲区
    UNIQUE_SESSION_NAME:用于为特定会话返回惟一的名称,并且名称的最长度为30字节.

    案例:
    1、创建一个发消息的过程:

    CREATE OR REPLACE PROCEDURE SEND_MESSAGE(PIPENAME VARCHAR2,
                                             MESSAGE  VARCHAR2) IS
      FLAG NUMBER;
    BEGIN
      FLAG := DBMS_PIPE.CREATE_PIPE(PIPENAME);
      IF FLAG = 0 THEN
        DBMS_PIPE.PACK_MESSAGE(MESSAGE);
        FLAG := DBMS_PIPE.SEND_MESSAGE(PIPENAME);
      END IF;
    END;
    /
     

    2、创建一个接收消息的包

    CREATE OR REPLACE PROCEDURE RECEIVE_MESSAGE(PIPENAME VARCHAR2,
                                                MESSAGE  OUT VARCHAR2) IS
      FLAG NUMBER;
    BEGIN
      FLAG := DBMS_PIPE.RECEIVE_MESSAGE(PIPENAME);
      IF FLAG = 0 THEN
        DBMS_PIPE.UNPACK_MESSAGE(MESSAGE);
        FLAG := DBMS_PIPE.REMOVE_PIPE(PIPENAME);
      END IF;
    END;
    /
     

    3、运行包

    --在一个会话中执行:
    exec send_message('pipe','I send message');
    --在另一会话中执行:
    var message varchar2(200);
    exec receive_message('pipe',:message);
    print message;
     

    执行结果如下:
    PL/SQL procedure successfully completed
    message
    ———
    I send message

  • 相关阅读:
    git命令参考
    Raft 简介
    关于 K8S 的几个问题
    Ubuntu中用普通方法无法添加自启动
    so编译 链接和加载
    GDB调试命令详解
    MinGW中的头文件路径
    GDB使用详解
    dlopen、dlsym和dlclose的使用
    Windows下配置VSCode使用mingww64的gcc、g++编译器和GDB调试器
  • 原文地址:https://www.cnblogs.com/linjiqin/p/3152635.html
Copyright © 2020-2023  润新知