DBMS_PIPE内置包用于在连接到相同数据库集群的会话内部或者会话之间传递消息。
注意事项
DBMS_PIPE不建议集群地址使用,可能引起长事务问题。
DBMS_PIPE子程序总览
子程序 | 说明 |
CREATE_PIPE Function | 创建一个命名管道。 |
NEXT_ITER_TYPE Function | 返回缓冲区中下一个数据成员的数据类型。 |
PACK_MESSAGE Procedures | 将一个数据项放入会话的本地消息缓冲区中。 |
UNPACK_MESSAGE Procedures | 访问缓冲区中的下一个数据项。 |
PURGE Procedure | 清除命名管道中的内容。 |
RECEIVE_MESSAGE Function | 将命名管道中的消息复制到本地缓冲区。 |
REMOVE_PIPE Function | 删除一个命名管道。 |
RESET_BUFFER Procedure | 清除本地缓冲区中的内容。 |
SEND_MESSAGE Function | 向命名管道发送消息。 |
UNIQUE_SESSION_NAME Function | 返回当前会话的唯一名称。 |
CREATE_PIPE Function
该函数用于创建一个命名管道。
语法
DBMS_PIPE.CREATE_PIPE (
pipename IN VARCHAR2,
maxpipesize IN INTEGER DEFAULT 8192,
private IN BOOLEAN DEFAULT TRUE)
RETURN INTEGER;
参数说明
参数 | 说明 |
pipename | 管道的名称。 |
maxpipesize | (可选参数)管道的最大容量,以字节为单位。默认值为8192字节。 |
private | (可选参数)是否创建为私有管道。取值如下:
|
返回值
返回值 | 说明 |
INTEGER | 创建管道操作返回的状态代码。0表示成功创建。 |
示例
该示例展示了如何创建一个命名管道。
DECLARE
status INTEGER;
BEGIN
status := DBMS_PIPE.CREATE_PIPE('messages');
DBMS_OUTPUT.PUT_LINE('CREATE_PIPE status: ' || status);
END;
NEXT_ITER_TYPE Function
该函数用于返回缓冲区中下一个数据成员的数据类型。
语法
DBMS_PIPE.NEXT_ITEM_TYPE() RETURN INTEGER;
返回值
返回值 | 说明 |
INTEGER | 缓冲区中下一个数据成员的数据类型。 |
示例
该示例展示了如何获取缓冲区的下一个数据成员的类型。示例中创建了两个会话,其中一个用于向管道发送消息,另一个会话接收消息。
SESSION A:
DECLARE
str VARCHAR2 := 'Character data';
status INTEGER;
BEGIN
DBMS_PIPE.PACK_MESSAGE(str);
-- SEND_MESSAGE status is: 0
status := DBMS_PIPE.SEND_MESSAGE('messages');
DBMS_OUTPUT.PUT_LINE('SEND_MESSAGE status is: ' || status);
END;
SESSION B:
DECLARE
str VARCHAR2;
status INTEGER;
BEGIN
status := DBMS_PIPE.RECEIVE_MESSAGE('messages');
-- RECEIVE_MESSAGE status is: 0
DBMS_OUTPUT.PUT_LINE('RECEIVE_MESSAGE status is: ' || status);
-- NEXT_ITEM_TYPE is: 9
status := DBMS_PIPE.NEXT_ITEM_TYPE;
DBMS_OUTPUT.PUT_LINE('NEXT_ITEM_TYPE is: ' || status);
-- VARCHAR2 Item is: Character data
DBMS_PIPE.UNPACK_MESSAGE(str);
DBMS_OUTPUT.PUT_LINE('VARCHAR2 Item is: ' || str);
END;
PACK_MESSAGE Procedures
该存储过程用于将数据项打包至消息缓冲区中。
语法
DBMS_PIPE.PACK_MESSAGE (
item IN VARCHAR2);
DBMS_PIPE.PACK_MESSAGE (
item IN NUMBER);
DBMS_PIPE.PACK_MESSAGE (
item IN DATE);
DBMS_PIPE.PACK_MESSAGE_RAW (
item IN RAW);
参数说明
参数 | 说明 |
item | 待打包到本地消息缓冲区的数据项。 |
示例
该示例展示了如何通过该存储过程发送不同类型的消息。
该部分只是消息发送的部分,消息接收的部分可以查看UNPACK_MESSAGE的示例。
DECLARE
str VARCHAR2 := 'Character data';
num NUMBER := '1024';
status INTEGER;
BEGIN
DBMS_PIPE.PACK_MESSAGE(str);
DBMS_PIPE.PACK_MESSAGE(num);
-- send message
status := DBMS_PIPE.SEND_MESSAGE('messages');
END;
UNPACK_MESSAGE Procedures
该存储过程用于访问缓冲区中的下一个数据项。
语法
DBMS_PIPE.UNPACK_MESSAGE (
item OUT VARCHAR2);
DBMS_PIPE.UNPACK_MESSAGE (
item OUT NUMBER);
DBMS_PIPE.UNPACK_MESSAGE (
item OUT DATE);
DBMS_PIPE.UNPACK_MESSAGE_RAW (
item OUT RAW);
参数说明
参数 | 说明 |
item | 从本地消息缓冲区获取数据项。 |
示例
该示例展示了如何接收管道中的消息。
DECLARE
str VARCHAR2;
num NUMBER;
status INTEGER;
BEGIN
-- RECEIVE_MESSAGE status is: 0
status := DBMS_PIPE.RECEIVE_MESSAGE('messages');
DBMS_OUTPUT.PUT_LINE('RECEIVE_MESSAGE status is: ' || status);
-- VARCHAR2 item is: Character data
DBMS_PIPE.UNPACK_MESSAGE(str);
DBMS_OUTPUT.PUT_LINE('VARCHAR2 item is: ' || str);
-- NUMBER item is: 1024
DBMS_PIPE.UNPACK_MESSAGE(num);
DBMS_OUTPUT.PUT_LINE('NUMBER item is: ' || num);
END;
PURGE Procedure
该存储过程用于清除命名管道以及接收缓冲区中的内容。
语法
DBMS_PIPE.PURGE (
pipename IN VARCHAR2);
参数说明
参数 | 说明 |
pipename | 目标管道的名称 |
示例
该示例展示了如何清除命名管道中的内容。
CALL DBMS_PIPE.PURGE('messages');
RECEIVE_MESSAGE Function
该函数用于将命名管道中的消息复制到本地缓冲区。
语法
DBMS_PIPE.RECEIVE_MESSAGE (
pipename IN VARCHAR2,
timeout IN INTEGER DEFAULT 86400)
RETURN INTEGER;
参数说明
参数 | 说明 |
pipename | 目标管道的名称。 |
timeout | (可选参数)等待消息的超时时间,单位为秒。默认值是86400。 |
返回值
返回值 | 说明 |
INTEGER | 调用结果的状态码。 |
示例
该示例展示了如何复制管道中的消息到缓冲区。
DECLARE
varchar VARCHAR2 := 'Character data';
status INTEGER;
result VARCHAR2;
idx INTEGER;
BEGIN
DBMS_PIPE.PACK_MESSAGE(varchar);
DBMS_PIPE.PACK_MESSAGE(varchar);
DBMS_PIPE.PACK_MESSAGE(varchar);
-- SEND_MESSAGE status is: 0
status := DBMS_PIPE.SEND_MESSAGE('messages');
DBMS_OUTPUT.PUT_LINE('SEND_MESSAGE status is: ' || status);
status := DBMS_PIPE.RECEIVE_MESSAGE('messages');
-- Character data
-- Character data
-- Character data
FOR idx in 1..3 LOOP
DBMS_PIPE.UNPACK_MESSAGE(result);
DBMS_OUTPUT.PUT_LINE(result);
END LOOP;
END;
REMOVE_PIPE Function
该函数用于删除一个命名管道。
语法
DBMS_PIPE.REMOVE_PIPE (
pipename IN VARCHAR2)
RETURN INTEGER;
参数说明
参数 | 说明 |
pipename | 目标管道名称。 |
返回值
返回值 | 说明 |
INTEGER | 调用结果的状态码。 |
示例
该示例展示了如何删除一个命名管道。
SELECT DBMS_PIPE.REMOVE_PIPE('messages') FROM DUAL;
remove_pipe
-------------
0
(1 row)
RESET_BUFFER Procedure
该存储过程用于清除发送缓冲区中的内容。
语法
DBMS_PIPE.RESET_BUFFER;
示例
该示例展示了如何清除本地缓冲区的内容。
CALL DBMS_PIPE.RESET_BUFFER;
SEND_MESSAGE Function
该函数用于向命名管道发送消息。
语法
DBMS_PIPE.SEND_MESSAGE (
pipename IN VARCHAR2,
timeout IN INTEGER DEFAULT 86400,
maxpipesize IN INTEGER DEFAULT 8192)
RETURN INTEGER;
参数说明
参数 | 说明 |
pipename | 管道名称 |
timeout | (可选参数)等待时间,单位为秒。默认值是86400。 |
maxpipesize | (可选参数)管道的最大容量,以字节为单位。默认值为8192字节。 |
返回值
返回值 | 说明 |
INTEGER | 调用结果的状态码。 |
示例
该示例用于展示如何将本地的数据发送到管道。
DECLARE
varchar VARCHAR2 := 'Character data';
status INTEGER;
result VARCHAR2;
idx INTEGER;
BEGIN
DBMS_PIPE.PACK_MESSAGE(varchar);
DBMS_PIPE.PACK_MESSAGE(varchar);
DBMS_PIPE.PACK_MESSAGE(varchar);
-- SEND_MESSAGE status is: 0
status := DBMS_PIPE.SEND_MESSAGE('messages');
DBMS_OUTPUT.PUT_LINE('SEND_MESSAGE status is: ' || status);
status := DBMS_PIPE.RECEIVE_MESSAGE('messages');
-- Character data
-- Character data
-- Character data
FOR idx in 1..3 LOOP
DBMS_PIPE.UNPACK_MESSAGE(result);
DBMS_OUTPUT.PUT_LINE(result);
END LOOP;
END;
UNIQUE_SESSION_NAME Function
该函数用于返回当前会话的唯一名称。
语法
DBMS_PIPE.UNIQUE_SESSION_NAME
RETURN VARCHAR2;
返回值
返回值 | 说明 |
VARCHAR2 | 当前会话的唯一名称。 |
示例
该示例用于展示如何获取当前会话的唯一名称。
SELECT DBMS_PIPE.UNIQUE_SESSION_NAME() FROM dual;
unique_session_name
-----------------------
POLARDB$PIPE$12$57884
(1 row)