Oracle系统包——DBMS_PIPE用法
2024-08-29 13:54:33
供稿:网友
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 completedmessage———I send message