PL/SQL:DBMS_PIPE包的使用
2013-01-21 18:29
375 查看
PL/SQL:DBMS_PIPE包的使用
包DBMS_PIPE用于在同一例程的不同会话之间进行管理通信.ORACLE管道(PIPE)类似于UNIX系统的管道,但它不是采用操作系统机制实现的,基管道信息被缓存在SGA中,当关闭例程时会丢失管道信息.在建立管道中,既可以建立公用管道,也可以建立私有管道.其中,公用管道是指所有数据库用户都可以的管道,而私有管道只能由建立管道的数据库用户访问.注意,如果用户要执行包DBMS_PIPE的过程和函数,则必须要为用户授权
如下:
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)时,一个会话需要将消息发送到管道中.而另一个会话则需要接收管道消息.当
发送信息到管道时,需要首先将消息写入本地消息缓冲区,然后将本地消息缓冲区内容发送到管道;
当接收管道消息时,需要首先使用本地消息缓冲区接收消息管道消息,然后从消息缓冲区中取得具体
消息.
示例一
示例二、
调用:
会话一
会话一
包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;
相关文章推荐
- PL/SQL:DBMS_PIPE包的使用
- PL/SQL-->DBMS_DDL包的使用
- 使用DBMS_HPROF进行PL/SQL代码探查
- Oracle PL/SQL管理LDAP服务器(DBMS_LDAP包的使用)
- 使用 DBMS_PROFILER 定位 PL/SQL 瓶颈代码
- PL/SQL --> DBMS_DDL包的使用
- PL/SQL --> DBMS_DDL包的使用
- 使用DBMS_HPROF包收集PL/SQL性能信息
- 在PL/SQL使用 dbms_metadata包中的方法得到表结构的信息以及建表sql语句。
- PL/SQL --> DBMS_DDL包的使用
- 使用 DBMS_PROFILER 定位 PL/SQL 瓶颈代码
- PL/SQL之DBMS_SQL程序包使用(1)(学习笔记)
- 使用DBMS_SHARED_POOL包将PL/SQL大对象保存到Shared Pool
- PL/SQL之DBMS_SQL程序包使用1
- PL/SQL:学会使用DBMS_JOB包
- 使用新版的PL/SQL DEVELOPER 8 发现不再支持DBMS_JOB了
- 关于dbms_sql的使用
- Oracle PL/SQL中如何使用%TYPE和%ROWTYPE
- 在pl/sql中使用exp/imp工具实现oracle数据导出/导入
- Oracle 9.2.0.8 RAC使用pl/sql连接数据库,查看数据库时间比现实时间晚8小时