VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

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_PIPE

  • 创建公有管道。

    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)
    

示例2 NEXT_ITEM_TYPE

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)

示例3 PACK_MESSAGE

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();

示例4 PURGE

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)

示例6 REMOVE_PIPE

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)

示例7 RESET_BUFFER

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();

示例8 UNIQUE_SESSION_NAME

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();

示例9 LIST_PIPES:查询所有管道信息。

SELECT name, items, "limit", private, owner 
FROM dbms_pipe.list_pipes() 
AS (name varchar, items integer, size integer, "limit" integer, private bool, owner varchar);