VastbaseG100

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

Menu

DBMS_AQADM

功能描述

Vastbase G100在Oracle兼容模式下支持内置包DBMS_AQADM的部分接口功能,该内置包提供了查询和设置会话相关状态的方法。

注意事项

该功能仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。

常量

该内置包包含以下常量:

参数 常量 说明
message grouping DBMS_AQADM NONE(0) 用于为队列指定消息分组。
DBMS_AQADM TRANSACTIONAL(1) 此常量已定义,但功能不支持。
queue_type DBMS_AQADM NORMAL_QUEUE(0) create_queue函数一起使用,用于指定queue_type。
DBMS_AQADM EXCEPTION_QUEUE(1) create_queue一起使用,用于指定queue_type。
注意:异常队列支持出队操作。
DBMS_AQADM NON_PERSISTENT_QUEUE(2) 此常量已定义,但功能不支持。
retention_time 0,1,2... create_queue一起使用,用于指定retention_time。
DBMS_AQADM INFINITE(-1) create_queue一起使用,用于指定retention_time。
aq$_purge_options_t.delivery_mode DBMS_AQADM PERSISTENT(0) 存储在表中的信息。
DBMS_AQADM BUFFERED(1) 此常量已定义,但功能不支持。
DBMS_AQADM PERSISTENT_OR_BUFFERED(2) 此常量已定义,但功能不支持。

子程序

该内置包当前包含以下子程序:

函数 描述
CREATE_QUEUE_TABLE 创建队列表。
DROP_QUEUE_TABLE 删除队列表。
ALTER_QUEUE_TABLE 修改现有队列表。
PURGE_QUEUE_TABLE 从队列中删除消息。
CREATE_QUEUE 在现有队列表中创建队列。
DROP_QUEUE 删除队列。
ALTER_QUEUE 修改现有队列。
START_QUEUE 为指定队列启用入队或出队。
STOP_QUEUE 在指定队列禁止入队或出队。

CREATE_QUEUE_TABLE

语法格式

CREATE_QUEUE_TABLE(
queue table         IN VARCHAR2,
queue_payload_type  IN VARCHAR2
storage_clause      IN VARCHAR2         DEFAULT NULL,
sort list           IN VARCHAR2         DEFAULT NULL,
multiple_consumers  IN BOOLEAN          DEFAULT FALSE,
message_grouping    IN BINARY_INTEGER   DEFAULT NONE,
comment             IN VARCHAR2         DEFAULT NULL,
auto_commit         IN BOOLEAN          DEFAULT TRUE,
primary_instance     IN BINARY_INTEGER  DEFAULT 0,
secondary_instance  IN BINARY_INTEGER   DEFAULT 0,
compatible          IN VARCHAR2         DEFAULT NULL,
secure              IN BOOLEAN          DEFAULT FALSE)

参数说明

  • queue table

    即将创建的队列表名称。

  • queue_payload_type

    存储在队列表中的用户自定义数据类型。

  • storage_clause

    队列表的存储参数,其被包含在创建队列表的建表语句中。

    • 当前版本只强制实施TABLESPACE选项,为了实现兼容性而支持其他选项,但被忽略。
    • 可使用TABLESPACE子句指定将在其中创建表的表空间名称。

    storage_clause可以是以下一项或多项:

    TABLESPACE tablespace_name |
    PCTFREE integer |
    PCTUSED integer |
    INITRANS integer |
    MAXTRANS integer |
    STORAGE storage option 
    

    其中storage option可以是以下一项或多项:

    MINEXTENTS integer |
    MAXEXTENTS integer |
    PCTINCREASE integer |
    INITIAL size_clause |
    NEXT |
    FREELISTS integer |
    OPTIMAL size_clause |
    BUFFER_POOL {KEEP|RECYCLE|DEFAULT}
    
  • sort_list

    控制队列的出队顺序。指定将用于对队列进行升序排序的列名称。当前可取值如下:

    • enq_time,priority

    • priority,enq_time

    • priority

    • enq_time

    若未指定本字段,则所有队列按照入队时间升序排列,满足先进先出机制。

  • multiple_consumers

    如果指定,则multiple_consumers必须为FALSE。

  • message_grouping

    如果指定,则message_grouping必须为NONE。

  • comment

    用户自定义的列表描述。

  • auto_commit

    为了实现兼容性而支持本参数,但被忽略。

  • primary_instance

    为了实现兼容性而支持本参数,但被忽略。

  • secondary_instance

    为了实现兼容性而支持本参数,但被忽略。

  • compatible

    为了实现兼容性而支持本参数,但被忽略。

  • secure

    为了实现兼容性而支持本参数,但被忽略。

示例

1、创建类型。

CREATE TYPE work_order as object (name VARCHAR2(20));

2、创建队列表。

declare 
begin 
DBMS_AQADM.CREATE_QUEUE_TABLE 
(queue_table => 'work_order_table', 
queue_payload_type => 'work_order', 
comment => 'Work order message queue table'); 
END; 
/

3、再次创建队列表时报错队列表已存在。

declare
begin
DBMS_AQADM.CREATE_QUEUE_TABLE
(queue_table => 'work_order_table',
queue_payload_type => 'work_order',
comment => 'Work order message queue table');
END;
/

返回信息如下:

ERROR:  call dbms_aqadm.create_queue_table failed.
ECODE:  P0001.
REASON: Queue table work_order_table has existed!
CONTEXT:  SQL statement "CALL dbms_aqadm.create_queue_table(queue_table => 'work_order_table',queue_payload_type => 'work_order',comment => 'Work order message queue table')"
PL/pgSQL function inline_code_block line 3 at PERFORM

4、查询所有队列表,列式展示查询结果。

\x
select * from all_dequeue_queues;

查询结果为:

-[ RECORD 1 ]---+-----------------------
owner           | public
name            | aq$_work_order_table_e
queue_table     | work_order_table
qid             | 2
queue_type      | EXCEPTION_QUEUE
max_retries     | 0
retry_delay     | 0
enqueue_enabled | NO
dequeue_enabled | NO
retention       | 0
user_comment    | exception queue
network_name    |

5、删除队列表并查询。

declare 
begin 
DBMS_AQADM.drop_QUEUE_TABLE 
(queue_table => 'work_order_table', 
force => TRUE); 
END; 
/ 

select * from all_dequeue_queues;

返回结果为如下,表示查询为空:

(No rows)

DROP_QUEUE_TABLE

语法格式

DROP_QUEUE_TABLE(
queue_table     IN VARCHAR2,
force           IN BOOLEAN      DEFAULT FALSE,
auto_commit     IN BOOLEAN      DEFAULT TRUE)

参数说明

  • queue_table

    即将删除的队列表名称。

  • force

    • FALSE表示如果队列表中存在任何队列则操作失败,默认情况。

    • TRUE表示删除队列表时,表中所有队列被自动停止和删除。

  • auto_commit

    为了实现兼容性而支持此参数,但被忽略。

示例

参见CREATE_QUEUE_TABLE的示例

ALTER_QUEUE_TABLE

语法格式

ALTER_QUEUE_TABLE (
queue_table        IN VARCHAR2,
comment            IN VARCHAR2       DEFAULT NULL,
primary_instance   IN BINARY_INTEGER DEFAULT 0,
secondary_instance IN BINARY_INTEGER DEFAULT 0)

参数说明

  • queue_table

    队列表的名称。

  • comment

    使用comment参数可以提供有关队列表的注释。

  • primary_instance

    为了实现兼容性而支持此参数,但被忽略。

  • secondary_instance

    为了实现兼容性而支持此参数,但被忽略。

示例

1、创建类型和队列表。

CREATE TYPE work_order_1141864 as object (name VARCHAR2(200)); 

call DBMS_AQADM.CREATE_QUEUE_TABLE ( 
queue_table => 'work_order_1141864_1', 
queue_payload_type => 'work_order_1141864', 
storage_clause =>'TABLESPACE pg_default', 
comment =>'sknn');

2、修改不存在的队列表。

call DBMS_AQADM.alter_QUEUE_TABLE(queue_table => 'work_order_1141655_1',comment=> '修改后的注释',primary_instance =>1, secondary_instance =>1); 

返回报错结果如下:

ERROR:  call dbms_aqadm.alter_queue_table failed.
ECODE:  P0001.
REASON: Queue table work_order_1141655_1 does not exist!

3、修改存在的队列表。

call DBMS_AQADM.alter_QUEUE_TABLE(queue_table => 'work_order_1141864_1',comment=> '修改后的注释',primary_instance =>1, secondary_instance =>1); 

返回结果为如下,表示修改队列表成功:

 alter_queue_table
-------------------

(1 row)

PURGE_QUEUE_TABLE

语法格式

PURGE_QUEUE_TABLE(
queue_table     IN VARCHAR2,
purge_condition IN VARCHAR2,
purge_options   IN aq$_purge_options_t)

参数说明

  • queue_table

    指定待删除消息的队列表的名称。

  • purge_condition

    指定清除队列表时的清除条件,清除条件必须是一个WHERE子句(不带where关键字)。清除条件是基于视图aq\$队列表名中的列,并且使用qtview来限定aq\$队列表名中的列。如果清除队列表中所有队列,则此参数设置为''NULL

  • purge_options

    purge_options是aq$_purge_options_t类型的对象。aq$_purge_options_t类型指定可用于清除队列表的选项。

    • 创建aq$_purge_options_t类型的语法格式:

      CREATE TYPE AQ$_PURGE_OPTIONS_T IS RECORD (
      block  BOOLEAN,
      delivery_mode  INTEGER );
      
    • 属性说明:

      • block:boolean类型。在表中所有队列上是否持有排他锁。 取值包括如下:
        • FALSE(默认值),表示表中所有队列上不存在排他锁。不阻塞并发的入队和出队,但可能造成清除操作失败。
        • TRUE,表示在进行当前清除操作时,在队列表的所有队列持有排他锁,并发的入队和出队将被阻塞,但清除操作总是可以成功执行。
      • delivery_mode:Integer类型。指定将清除的消息类型。唯一可接受的值为DBMS_AQADM.PERSISTENT。

示例

1、创建类型和队列表。

CREATE TYPE work_order_1141914 as object (id int,name VARCHAR2(200));

call DBMS_AQADM.CREATE_QUEUE_TABLE (
queue_table => 'work_order_1141914_1',
queue_payload_type => 'work_order_1141914');

2、创建普通队列。

call DBMS_AQADM.CREATE_QUEUE ( queue_name => 'workorder_1141914', queue_table => 'work_order_1141914_1', comment => 'This queue contains pending work orders.',dependency_tracking=>false,auto_commit => true);
call DBMS_AQADM.CREATE_QUEUE ( queue_name => 'workorder_1141914_1', queue_table => 'work_order_1141914_1', comment => 'This queue contains pending work orders.',dependency_tracking=>false,auto_commit => true);
call DBMS_AQADM.CREATE_QUEUE ( queue_name => 'workorder_1141914_2', queue_table => 'work_order_1141914_1', comment => 'This queue contains pending work orders.',dependency_tracking=>false,auto_commit => true);
call DBMS_AQADM.CREATE_QUEUE ( queue_name => 'workorder_1141914_3', queue_table => 'work_order_1141914_1', comment => 'This queue contains pending work orders.',dependency_tracking=>false,auto_commit => true);

3、启动队列。

call DBMS_AQADM.start_QUEUE(queue_name => 'workorder_1141914');
call DBMS_AQADM.start_QUEUE(queue_name => 'workorder_1141914_1');
call DBMS_AQADM.start_QUEUE(queue_name => 'workorder_1141914_2');
call DBMS_AQADM.start_QUEUE(queue_name => 'workorder_1141914_3');

4、在匿名块中调用DBMS_AQ.enqueue函数,并查询类型的数量。

declare
c1 dbms_AQ.enqueue_options_t;
c2 dbms_AQ.message_properties_t;
v1 raw(16);
o1 work_order_1141914;
BEGIN
o1:=work_order_1141914(1,'message');
dbms_AQ.enqueue(queue_name => 'workorder_1141914',enqueue_options => c1,message_properties => c2,payload => o1,msgid => v1);
dbms_AQ.enqueue(queue_name => 'workorder_1141914_1',enqueue_options => c1,message_properties => c2,payload => o1,msgid => v1);
dbms_AQ.enqueue(queue_name => 'workorder_1141914_2',enqueue_options => c1,message_properties => c2,payload => o1,msgid => v1);
dbms_AQ.enqueue(queue_name => 'workorder_1141914_3',enqueue_options => c1,message_properties => c2,payload => o1,msgid => v1);
end;
/

select count(*) from aq$work_order_1141914_1;

查询结果为:

 count
-------
     4
(1 row)

5、在匿名块中调用DBMS_AQADM.purge_queue_table函数,并查询类型的数量。

DECLARE
p1 dbms_aqadm.aq$_purge_options_t;
BEGIN
dbms_aqadm.purge_queue_table(queue_table => 'work_order_1141914_1',purge_condition=> '',purge_options=>p1);
end;
/

select count(*) from aq$work_order_1141914_1;

查询结果为如下,表示已完成清理所有信息:

 count
-------
     0
(1 row)

CREATE_QUEUE

语法格式

CREATE_QUEUE(
queue_name            IN VARCHAR2,
queue_table           IN VARCHAR2,
queue_type            IN BINARY_INTEGER    DEFAULT 0,
max_retries           IN NUMBER            DEFAULT 0,
retry_delay           IN NUMBER            DEFAULT 0,
retention_time        IN NUMBER            DEFAULT 0,
dependency_tracking   IN BOOLEAN           DEFAULT FALSE,
comment               IN VARCHAR2          DEFAULT NULL,
auto_commit           IN BOOLEAN           DEFAULT TRUE)

参数说明

  • queue_name

    即将被创建的队列名称 ,在schema内是唯一的。

  • queue_table

    队列所属队列表名称。

  • queue_type

    队列的类型。queue_type取值如下:

    • DBMS_AQADM.NORMAL_QUEUE:此值指定普通队列(默认值)。
    • DBMS_AQADM.EXCEPTION_QUEUE:此值指定新队列是异常队列。异常队列仅支持出队操作。
  • max_retries

    一个队列消息使用REMOVE模式出队时尝试的最大次数。当应用在执行dequeue后发生rollback则对应增加RETRY_COUNT。当失败的尝试次数达到max_retries指定的值之后,消息移动到异常队列。

    默认值为0。

  • retry_delay

    延迟时间,单位为秒,默认值为0,表示消息应尽快被重试。 如果max_retries设置为0,则此参数不生效。

  • retention_time

    指定消息在出队之后在队列表中保留的时间长度。单位:秒。

    • 指定为默认值0时,表示消息在出队之后不应保留。
    • NUMBER表示保留的秒数。
    • 指定为INFINITE时,表示永久保留消息。
  • dependency_tracking

    保留供将来使用,默认是FALSE,不允许为TRUE。

  • comment

    用户指定的队列说明。

  • auto_commit

    为了实现兼容性而支持此参数,但被忽略。

示例

1、创建类型和队列表。

CREATE TYPE work_order_1141864 as object (name VARCHAR2(200)); 

call DBMS_AQADM.CREATE_QUEUE_TABLE ( 
queue_table => 'work_order_1141864_1', 
queue_payload_type => 'work_order_1141864', 
storage_clause =>'TABLESPACE pg_default', 
comment =>'sknn');

2、创建普通队列,并查询队列信息。

call DBMS_AQADM.CREATE_QUEUE ( queue_name => 'workorder_1141864', queue_table => 'work_order_1141864_1', comment => 'This queue contains pending work orders.',dependency_tracking=>false,auto_commit => true); 

select max_retries,retry_delay from all_dequeue_queues where name = 'workorder_1141864'; 

查询队列信息结果如下:

 max_retries | retry_delay
-------------+-------------
             |           0
(1 row)

3、修改max_retries参数。

call DBMS_AQADM.alter_queue ( queue_name => 'workorder_1141864', max_retries => 4); 

4、查询队列信息。

select max_retries,retry_delay from all_dequeue_queues where name = 'workorder_1141864'; 

结果显示为如下,表示成功修改max_retries参数。

 max_retries | retry_delay
-------------+-------------
           4 |           0
(1 row)

5、删除队列。

call DBMS_AQADM.drop_queue ( queue_name => 'workorder_1141864', auto_commit => true); 

返回结果为如下,表示删除队列成功:

 drop_queue
-------------

(1 row)

DROP_QUEUE

语法格式

DROP_QUEUE(
queue_name  IN VARCHAR2,
auto_commit IN BOOLEAN      DEFAULT TRUE)

参数说明

  • queue_name

    即将删除的队列名称

  • auto_commit

    为了实现兼容性而支持此参数,但被忽略。

示例

删除队列参见DBMS_AQADM.start_queue的示例

ALTER_QUEUE

语法格式

ALTER_QUEUE(
queue_name         IN VARCHAR2,
max_retries        IN NUMBER      DEFAULT NULL,
retry_delay        IN NUMBER      DEFAULT NULL,
retention_time     IN NUMBER      DEFAULT NULL,
auto_commit        IN BOOLEAN     DEFAULT TRUE,
comment            IN VARCHAR2    DEFAULT NULL)

参数说明

  • queue_name

    即将修改的队列名称

  • max_retries

    默认值为0。表示一个队列消息使用REMOVE模式出队时尝试的最大次数。当应用在执行dequeue后发生rollback则对应增加RETRY_COUNT。当失败的尝试次数达到max_retries指定的值之后,消息移动到异常队列。

  • retry_delay

    延迟时间,单位为秒,默认值为0,表示消息应尽快被重试。 如果max_retries设置为0,则此参数不生效。

  • retention_time

    指定消息在出队之后在队列表中保留的时间长度。单位:秒。

    • 指定为默认值0时,表示消息在出队之后不应保留。
    • NUMBER表示保留的秒数
    • 指定为INFINITE时,表示永久保留消息。
  • auto_commit

    为了实现兼容性而支持此参数,但被忽略。

  • comment

    用户指定的队列说明,起到注释的作用。

示例

参见DBMS_AQADM.create_queue的示例

START_QUEUE

语法格式

START_QUEUE(
queue_name      IN VARCHAR2,
enqueue         IN BOOLEAN    DEFAULT TRUE,
dequeue         IN BOOLEAN    DEFAULT TRUE)

参数说明

  • queue_name

    指定要启动的队列的名称。

  • enqueue

    • 指定TRUE(默认)时,启用排队。
    • 指定FALSE时,保持当前设置不变。
  • dequeue

    • 指定TRUE(默认)时,启用出队。
    • 指定FALSE时,保持当前设置不变。

示例

1、创建类型和队列表。

CREATE TYPE work_order_1141927 as object (name VARCHAR2(200));

call DBMS_AQADM.CREATE_QUEUE_TABLE (
queue_table => 'work_order_1141927_1',
queue_payload_type => 'work_order_1141927',
storage_clause =>'TABLESPACE pg_default',
comment =>'sknn');

2、创建普通队列。

call DBMS_AQADM.CREATE_QUEUE ( queue_name => 'workorder_1141927', queue_table => 'work_order_1141927_1', comment => 'This queue contains pending work orders.',dependency_tracking=>false,auto_commit => true);

3、调用start_queue函数。

call dbms_AQADM.start_queue(queue_name => 'workorder_1141927');

返回信息如下,表示函数执行成功:

 start_queue
-------------

(1 row)

4、删除队列提示未停止。

call DBMS_AQADM.DROP_QUEUE(queue_name => 'workorder_1141927');

显示信息如下,报错表示队列未停止,则不能删除:


ERROR:  call dbms_aqadm.drop_queue failed.
ECODE:  P0001.
REASON: Cannot delete queue workorder_1141927 because the queue has not been stopped!

5、停止队列后删除。

call dbms_AQADM.stop_queue(queue_name => 'workorder_1141927');
call DBMS_AQADM.DROP_QUEUE(queue_name => 'workorder_1141927');

返回结果如下,分别表示成功停止队列和删除队列:

 stop_queue
------------

(1 row)

 drop_queue
------------

(1 row)

STOP_QUEUE

语法格式

STOP_QUEUE(
queue_name    IN VARCHAR2,
enqueue       IN BOOLEAN      DEFAULT TRUE,
dequeue       IN BOOLEAN      DEFAULT TRUE,
wait          IN BOOLEAN      DEFAULT TRUE)

参数说明

  • queue_name

    指定要停止的队列的名称。

  • enqueue

    • 指定TRUE(默认)时,禁用排队。
    • 指定FALSE时,保持当前设置不变。
  • dequeue

    • 指定TRUE(默认)时,禁用出队。
    • 指定FALSE时,保持当前设置不变。
  • wait

    • 指定为TRUE时,表示服务器等待任何未完成的事务完成,然后再应用指定的更改。在等待停止队列时,在指定队列中不允许任何事务排队或取消排队。
    • 指定为FALSE时,立即停止队列。

示例

参见DBMS_AQADM.start_queue的示例