您可以使用DBMS_AQADM
包中的存儲過程創建并管理消息隊列和隊列表。
使用DBMS_AQADM
包中的存儲過程創建和管理消息隊列和隊列表,需要使用超級用戶操作,如您有相應需求,請聯系我們處理。
表 1. DBMS_AQADM函數/存儲過程
函數/存儲過程 | 返回類型 | 說明 |
ALTER_QUEUE | N/A | 修改現有的隊列。 |
ALTER_QUEUE_TABLE | N/A | 修改現有的隊列表。 |
CREATE_QUEUE | N/A | 創建隊列。 |
CREATE_QUEUE_TABLE | N/A | 創建隊列表。 |
DROP_QUEUE | N/A | 刪除現有隊列。 |
DROP_QUEUE_TABLE | N/A | 刪除現有隊列表。 |
PURGE_QUEUE_TABLE | N/A | 從隊列表中刪除一個或多個消息。 |
START_QUEUE | N/A | 使隊列對于入隊和出隊過程可用。 |
STOP_QUEUE | N/A | 使隊列對于入隊和出隊過程不可用。 |
PolarDB PostgreSQL版(兼容Oracle)支持使用下面列出的參數:
常量 | 說明 | 適用參數 |
DBMS_AQADM.TRANSACTIONAL(1) | 此常量已定義,但是,如果使用會返回錯誤。 | message_grouping |
DBMS_AQADM.NONE(0) | 用于為隊列表指定消息分組。 | message_grouping |
DBMS_AQADM.NORMAL_QUEUE(0) | 與create_queue一起使用來指定queue_type。 | queue_type |
DBMS_AQADM.NORMAL_QUEUE(0) | 與create_queue一起使用來指定queue_type。 | queue_type |
DBMS_AQADM.INFINITE(-1) | 與create_queue 一起使用來指定retention_time。 | retention_time |
DBMS_AQADM.PERSISTENT (0) | 此消息應存儲在表中。 | enqueue_options_t.delivery_mode |
DBMS_AQADM.BUFFERED (1) | 此常量已定義,但是,如果使用會返回錯誤。 | enqueue_options_t.delivery_mode |
DBMS_AQADM.PERSISTENT_OR_BUFFERED (2) | 此常量已定義,但是,如果使用會返回錯誤。 | enqueue_options_t.delivery_mode |
使用說明
ALTER_QUEUE
使用ALTER_QUEUE
存儲過程修改現有隊列。
語法
ALTER_QUEUE(
max_retries IN NUMBER DEFAULT NULL,
retry_delay IN NUMBER DEFAULT 0
retention_time IN NUMBER DEFAULT 0,
auto_commit IN BOOLEAN DEFAULT TRUE)
comment IN VARCHAR2 DEFAULT NULL,
參數
參數 | 描述 |
queue_name | 新隊列的名稱。 |
max_retries | 指定使用 max_retries的值會隨著 |
retry_delay | 指定在 |
retention_time | 指定消息在出隊之后進行存儲所經過的時間長度。單位:秒。 說明
|
comment | 指定與隊列關聯的注釋。 |
示例
以下代碼塊,將 work_order
的隊列中的retry_delay參數設置為5秒:
EXEC DBMS_AQADM.ALTER_QUEUE(queue_name => 'work_order', retry_delay => 5);
ALTER_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 | 為了實現兼容性而支持此參數,可忽略。 |
示例
以下命令修改名為work_order_table
的隊列表:
EXEC DBMS_AQADM.ALTER_QUEUE_TABLE
(queue_table => 'work_order_table', comment => 'This queue table contains work orders for the shipping department.');
CREATE_QUEUE
使用CREATE_QUEUE
存儲過程在現有隊列表中創建隊列。
語法
CREATE_QUEUE(
queue_name IN VARCHAR2
queue_table IN VARCHAR2,
queue_type IN BINARY_INTEGER DEFAULT NORMAL_QUEUE,
max_retries IN NUMBER DEFAULT 5,
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 | 新隊列的名稱。 |
queue_table | 新隊列所在的表的名稱。 |
queue_type | 新隊列的類型。queue_type取值如下:
|
max_retries | 指定使用 |
retry_delay | 指定在 |
retention_time | 指定消息在出隊之后進行存儲所經過的時間長度。單位:秒。 說明
|
dependency_tracking | 為了實現兼容性而支持此參數,但被忽略。 |
comment | 指定與隊列關聯的注釋。 |
auto_commit | 為了實現兼容性而支持此參數,可忽略。 |
示例
以下匿名塊在work_order_table
表中創建名為work_order
的隊列:
BEGIN
DBMS_AQADM.CREATE_QUEUE ( queue_name => 'work_order', queue_table => 'work_order_table', comment => 'This queue contains pending work orders.');
END;
CREATE_QUEUE_TABLE
使用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 | 存儲在隊列表中的用戶自定義的數據類型。 說明 如果要指定RAW數據類型,您必須在用戶定義類型中創建RAW數據類型。 |
storage_clause | 指定隊列表的屬性。
|
sort_list | 控制隊列的出隊順序。指定將用于對隊列進行排序(升序)的列名稱。當前取值如下:
|
multiple_consumers | 如果指定,multiple_consumers必須為FALSE。 |
message_grouping | 如果指定,message_grouping必須為 NONE。 |
comment | 提供有關隊列表的注釋。 |
auto_commit | 為了實現兼容性而支持此參數,可忽略。 |
primary_instance | 為了實現兼容性而支持此參數,可忽略。 |
secondary_instance | 為了實現兼容性而支持此參數,可忽略。 |
compatible | 為了實現兼容性而支持此參數,可忽略。 |
secure | 為了實現兼容性而支持此參數,可忽略。 |
示例
以下匿名塊首先創建work_order
類型,該類型具有保存名稱VARCHAR2的屬性,以及項目說明。然后,使用該類型創建隊列表:
BEGIN
CREATE TYPE work_order AS (name VARCHAR2, project TEXT, completed BOOLEAN);
EXEC DBMS_AQADM.CREATE_QUEUE_TABLE
(queue_table => 'work_order_table',
queue_payload_type => 'work_order',
comment => 'Work order message queue table');
END;
隊列表名為work_order_table
,包含類型為work_order
的有效負載。注釋說明為Work order message queue table
。
DROP_QUEUE
使用DROP_QUEUE
存儲過程可以刪除隊列。
語法
DROP_QUEUE(
queue_name IN VARCHAR2,
auto_commit IN BOOLEAN DEFAULT TRUE)
參數
參數 | 描述 |
queue_name | 要刪除的隊列的名稱。 |
auto_commit | 為了實現兼容性而支持此參數,但被忽略。 |
示例
以下匿名塊刪除名為work_order
的隊列:
BEGIN
DBMS_AQADM.DROP_QUEUE(queue_name => 'work_order');
END;
DROP_QUEUE_TABLE
使用DROP_QUEUE_TABLE
存儲過程可以刪除隊列表。
語法
DROP_QUEUE_TABLE(
queue_table IN VARCHAR2,
force IN BOOLEAN default FALSE,
auto_commit IN BOOLEAN default TRUE)
參數
參數 | 描述 |
queue_table | 隊列表的名稱。 |
force | 指定
|
auto_commit | 為了實現兼容性而支持此參數,但被忽略。 |
示例
以下匿名塊刪除名為work_order_table
的表:
BEGIN
DBMS_AQADM.DROP_QUEUE_TABLE ('work_order_table', force => TRUE);
END;
PURGE_QUEUE_TABLE
使用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子句)。 |
purge_options | purge_options是類型為 |
表 2. aq$_purge_options_t
屬性 | 類型 | 說明 |
Block | Boolean | 在表中所有隊列上是否保有排他鎖。
|
delivery_mode | INTEGER | 指定將清除的消息類型。唯一可接受的值為 |
示例
以下匿名塊從work_order_table
中刪除completed
列值為YES的任何消息:
DECLARE
purge_options dbms_aqadm.aq$_purge_options_t;
BEGIN
dbms_aqadm.purge_queue_table('work_order_table', 'completed = YES', purge_options);
END;
START_QUEUE
使用START_QUEUE
存儲過程使隊列可用于排隊和取消排隊。
語法
START_QUEUE(
queue_name IN VARCHAR2,
enqueue IN BOOLEAN DEFAULT TRUE,
dequeue IN BOOLEAN DEFAULT TRUE)
參數
參數 | 描述 |
queue_name | 指定要啟動的隊列的名稱。 |
enqueue |
|
dequeue |
|
示例
以下匿名塊使名為work_order
的隊列可用于排隊:
BEGIN
DBMS_AQADM.START_QUEUE
(queue_name => 'work_order);
END;
STOP_QUEUE
使用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 |
|
dequeue |
|
wait |
|
示例
以下匿名塊在名為work_order
的隊列中禁用排隊和取消排隊:
BEGIN
DBMS_AQADM.STOP_QUEUE(queue_name =>'work_order', enqueue=>TRUE, dequeue=>TRUE, wait=>TRUE);
END;
排隊和取消排隊將在任何未完成的事務完成之后停止。