DBMS_PIPE
功能描述
dbms_pipe包用于在同一个实例中,通过一个管道来实现会话内或会话之间的消息传递。
注意事项
要执行dbms_pipe中的函数,用户须授权执行如下命令:
select dbms_output.serveroutput(true);
视图
该内置包包含以下视图:
视图 | 描述 |
---|---|
DB_PIPES | 用于查询数据库中所有的管道。 |
select * from dbms_pipe.db_pipes;
示例
可参见示例6。
子程序
该内置包包含以下子程序:
子程序 | 描述 | |
---|---|---|
CREATE_PIPE | 使用指定的名称显示地创建了一个公有或私有的管道。 | |
NEXT_ITEM_TYPE | 返回消息缓存中下一个数据成员的数据类型。 | |
PACK_MESSAGE | 在本地缓存中构建消息。 | |
PURGE | 清除指定的管道中的消息。 | |
RECEIVE_MESSAGE | 将消息从命名管道复制到本地缓冲区。 | |
REMOVE_PIPE | 清除指定管道。 | |
RESET_BUFFER | 清除本地缓存中的内容。 | |
SEND_MESSAGE | 从会话的本地消息缓冲区中将一条消息发送到指定的管道中。 | |
UNIQUE_SESSION_NAME | 返回当前会话的一个唯一名称。 | |
UNPACK_MESSAGE函数 说明:该函数根据返回类型实现了右侧所示六种函数 |
UNPACK_MESSAGE_BYTEA | 该函数用于把本地消息缓冲区中的消息和数据项拷贝到程序变量中,在使用该函数前必须使用函数RECEIVE_MESSAGE把消息从管道读取到本地缓冲区中。 |
UNPACK_MESSAGE_DATE | ||
UNPACK_MESSAGE_NUMBER | ||
UNPACK_MESSAGE_RECORD | ||
UNPACK_MESSAGE_TEXT | ||
UNPACK_MESSAGE_TIMESTAMP | ||
LIST_PIPES | 列出所有管道。 |
CREATE_PIPE
语法格式
DBMS_PIPE.CREATE_PIPE (
pipename IN VARCHAR2,
maxpipesize IN INTEGER DEFAULT 8192,
private IN BOOLEAN DEFAULT TRUE)
RETURN INTEGER;
参数说明
pipename
用户创建的管道名称。
maxpipesize
管道允许的最大大小,以字节为单位。
private
使用默认值TRUE创建私有管道。调用时可以隐式创建公共管道SEND_MESSAGE。
示例
参见示例1。
NEXT_ITEM_TYPE
语法格式
DBMS_PIPE.NEXT_ITEM_TYPE
RETURN INTEGER;
示例
参见示例2。
PACK_MESSAGE
语法格式
DBMS_PIPE.PACK_MESSAGE (
item IN VARCHAR2|NCHAR|NUMBER|DATE|RAW|ROWID);
参数说明
item
要打包到本地消息缓冲区的项目。
示例
参见示例3。
PURGE
语法格式
DBMS_PIPE.PURGE (
pipename IN VARCHAR2);
参数说明
pipename
要删除消息的管道名称。
示例
参见示例4。
RECEIVE_MESSAGE
语法格式
DBMS_PIPE.RECEIVE_MESSAGE (
pipename IN VARCHAR2,
timeout IN INTEGER DEFAULT maxwait)
RETURN INTEGER;
参数说明
pipename
接收消息的管道名称。
timeout
等待消息的时间,以秒为单位。
示例
参见示例5。
UNIQUE_SESSION_NAME
语法格式
DBMS_PIPE.UNIQUE_SESSION_NAME
RETURN VARCHAR2;
示例
参见示例8。
UNPACK_MESSAGE
语法格式
DBMS_PIPE.UNPACK_MESSAGE_BYTEA/DATE/NUMBER/RECORD/TEXT/TIMESTAMP (
item OUT BYTEA|DATE|NUMBER|RECORD|TEXT|TIMESTAMP);
参数说明
item
输出参数,表示从缓冲区接受数据的数据类型。
示例
参见示例5。
LIST_PIPES
语法格式
DBMS_PIPE.LIST_PIPES() ;
示例
参见示例9。
示例
前置步骤 用户须授权执行如下命令:
select dbms_output.serveroutput(true);
创建公有管道。
1、创建公有管道。
CREATE OR REPLACE FUNCTION test_create_pipeone() RETURNS void AS $$ BEGIN perform dbms_pipe.create_pipe('messageone'); END; $$ LANGUAGE plpgsql; select test_create_pipeone();
2、查看是否创建成功。
SELECT * FROM dbms_pipe.db_pipes;
返回结果为如下,可以在视图中查看到创建的管道:
name | items | size | limit | private | owner ------------+-------+------+-------+---------+------- messageone | 0 | 0 | | f | (1 row)
创建私有管道。
1、创建私有管道。
CREATE OR REPLACE FUNCTION test_create_pipetwo() RETURNS void AS $$ BEGIN perform dbms_pipe.create_pipe('messagetwo', 32, true); END; $$ LANGUAGE plpgsql; select test_create_pipetwo();
2、查看是否创建成功。
SELECT * FROM dbms_pipe.db_pipes;
返回结果为如下,可以在视图中查看到创建的管道:
name | items | size | limit | private | owner ------------+-------+------+-------+---------+---------- messageone | 0 | 0 | | f | messagetwo | 0 | 0 | 32 | t | vastbase (2 rows)
1、在会话1执行如下语句。
select dbms_pipe.pack_message(123);
select dbms_pipe.send_message('test_pipe');
返回结果为如下:
pack_message
--------------
(1 row)
send_message
--------------
0
(1 row)
2、在会话2执行如下语句。
select dbms_pipe.receive_message('test_pipe');
select dbms_pipe.next_item_type();
select dbms_pipe.unpack_message_number();
返回结果为如下:
receive_message
-----------------
0
(1 row)
next_item_type
----------------
9
(1 row)
unpack_message_number
-----------------------
123
(1 row)
CREATE OR REPLACE FUNCTION test_pack_message1() RETURNS void AS
$$
DECLARE
v_number NUMBER := 123;
v_varchar TEXT := 'Character data';
status INTEGER;
BEGIN
perform dbms_pipe.pack_message(v_number);
Perform dbms_pipe.pack_message(v_varchar);
status := dbms_pipe.send_message('datatypes');
dbms_output.put_line('send_message status:' || status);
END;
$$
LANGUAGE plpgsql;
select test_pack_message1();
1、在会话1执行如下语句。
CREATE OR REPLACE FUNCTION test_create_pipe2() RETURNS void AS
$$
DECLARE
BEGIN
perform dbms_pipe.create_pipe('message');
perform dbms_pipe.pack_message('test1');
dbms_pipe.send_message('message');
Perform dbms_pipe.pack_message('test2');
dbms_pipe.send_message('message');
END;
$$
LANGUAGE plpgsql;
2、在会话2执行如下语句。
CREATE OR REPLACE FUNCTION test_purge() RETURNS void AS
$$
DECLARE
v_item TEXT;
BEGIN
dbms_pipe.receive_message('message', 10);
v_item := dbms_pipe.unpack_message_text();
dbms_output.put_line('Item:' || v_item);
END;
$$
LANGUAGE plpgsql;
3、在会话2执行如下语句,删除管道中的剩余的message。
SELECT dbms_pipe.purge('pipe');
示例5 RECEIVE_MESSAGE、SEND_MESSAGE 、UNPACK_MESSAGE
1、在会话1执行如下语句。
select dbms_pipe.pack_message('u r testing receive_message');
select dbms_pipe.send_message('test_receive');
返回结果为如下:
pack_message
--------------
(1 row)
send_message
--------------
0
(1 row)
2、在会话2执行如下语句。
select dbms_pipe.receive_message('test_receive');
select dbms_pipe.unpack_message_text();
返回结果为如下:
receive_message
-----------------
0
(1 row)
unpack_message_text
-----------------------------
u r testing receive_message
(1 row)
1、创建名为test_remove的管道,并查询当前已创建的管道。
select dbms_pipe.create_pipe('test_remove');
select * from dbms_pipe.db_pipes;
查询结果示例如下(实际返回结果以用户环境为主),其中已有管道test_remove的信息:
name | items | size | limit | private | owner
-------------+-------+------+-------+---------+----------
messageone | 0 | 0 | | f |
messagetwo | 0 | 0 | 32 | t | vastbase
datatypes | 2 | 144 | | f |
test_remove | 0 | 0 | | f |
(4 rows)
2、执行如下语句移除test_remove管道,并查看是否移除成功。
select dbms_pipe.remove_pipe('test_remove');
select * from dbms_pipe.db_pipes;
示例结果为如下(实际返回结果以用户环境为主),test_remove管道已被移除:
name | items | size | limit | private | owner
------------+-------+------+-------+---------+----------
messageone | 0 | 0 | | f |
messagetwo | 0 | 0 | 32 | t | vastbase
datatypes | 2 | 144 | | f |
(3 rows)
1、在会话1中执行如下语句。
select dbms_pipe.pack_message('u r testing reset_buffer');
select dbms_pipe.send_message('reset_buffer');
2、在会话2中执行如下语句。
select dbms_pipe.receive_message('reset_buffer');
select dbms_pipe.reset_buffer();
select dbms_pipe.unpack_message_text();
CREATE OR REPLACE FUNCTION test_unique_session_name() RETURNS void AS
$$
DECLARE
v_session TEXT;
BEGIN
v_session := dbms_pipe.unique_session_name();
dbms_output.put_line('unique_session_name:' || v_session);
END;
$$
LANGUAGE plpgsql;
select test_unique_session_name();
SELECT name, items, "limit", private, owner
FROM dbms_pipe.list_pipes()
AS (name varchar, items integer, size integer, "limit" integer, private bool, owner varchar);