oracle 高级队列
转载:http://www.idevelopment.info/data/Oracle/DBA_tips/Advanced_Queuing/AQ_2.shtml
Overview
This article provides a brief overview on configuring and using Oracle's Advanced Queuing features using PL/SQL. This will demonstrate the basic functionality of Oracle Advanced Queuing (AQ). AQ was first introduced in Oracle8 and has been extended and improved on into future versions.
Setup and Configuration
Within this section of the article, I provide the steps required to configure our QA environment. This involves creating users and assigning them the privileges required to perform all necessary AQ operations.
Before creating the users, let's take a look at the two major roles that are provided for performing AQ administration and user operations:
AQ_ADMINISTRATOR_ROLE
This role allows for the creation and administration of the queuing infrastructure.
AQ_USER_ROLE
This role allows users to access queues for enqueue and dequeue operations.
Now, let's create the following two schemas; one owning the queuing infrastructure and another with access to it:
create_aq_users.sql
CONNECT sys/change_on_install as sysdba -- ------------------------------------------------------- DROP USER aq_admin_plsql CASCADE; CREATE USER aq_admin_plsql IDENTIFIED BY aq_admin_plsql
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp; ALTER USER aq_admin_plsql QUOTA UNLIMITED ON users; GRANT aq_administrator_role TO aq_admin_plsql;
GRANT connect TO aq_admin_plsql;
GRANT create type TO aq_admin_plsql;
GRANT create sequence TO aq_admin_plsql; EXECUTE dbms_aqadm.grant_type_access('aq_admin_plsql'); -- ------------------------------------------------------- DROP USER aq_user_plsql CASCADE; CREATE USER aq_user_plsql IDENTIFIED BY aq_user_plsql
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp; GRANT aq_user_role TO aq_user_plsql;
GRANT connect TO aq_user_plsql;
Define Payload
The content, or payload, of a message is often defined using an OBJECT TYPE. We must define this before creating the queue. We also grant EXECUTE on the payload object type to our AQ user:
create_payload.sql
CONNECT aq_admin_plsql/aq_admin_plsql CREATE TYPE message_type AS OBJECT (
message_id NUMBER(15)
, subject VARCHAR2(100)
, text VARCHAR2(100)
, dollar_value NUMBER(4,2)
)
/ GRANT EXECUTE ON message_type TO aq_user_plsql; CREATE SEQUENCE message_seq
INCREMENT BY 1
START WITH 1000
NOMAXVALUE
NOCYCLE; GRANT select ON message_seq TO aq_user_plsql;
Create Queue Table and Queue
Now that we have the payload created, it is time to create the queuing infrastructure. Queues are implemented using a queue table which can hold multiple queues with the same payload type.
First the queue table must be defined using the payload type, then the queue can be defined and started. All of these operations can be performed using the DBMS_AQADM package as follows:
create_queue_table_and_queue.sql
CONNECT aq_admin_plsql/aq_admin_plsql SET SERVEROUTPUT ON BEGIN -- ------------------------------------------------------- DBMS_AQADM.CREATE_QUEUE_TABLE (
queue_table => 'aq_admin_plsql.msg_qt'
, queue_payload_type => 'aq_admin_plsql.message_type'
); -- ------------------------------------------------------- DBMS_AQADM.CREATE_QUEUE (
queue_name => 'msg_queue'
, queue_table => 'aq_admin_plsql.msg_qt'
, queue_type => DBMS_AQADM.NORMAL_QUEUE
, max_retries => 0
, retry_delay => 0
, retention_time => 1209600
, dependency_tracking => FALSE
, comment => 'Test Object Type Queue'
, auto_commit => FALSE
); -- ------------------------------------------------------- DBMS_AQADM.START_QUEUE('msg_queue'); -- ------------------------------------------------------- DBMS_AQADM.GRANT_QUEUE_PRIVILEGE (
privilege => 'ALL'
, queue_name => 'aq_admin_plsql.msg_queue'
, grantee => 'aq_user_plsql'
, grant_option => FALSE
); -- ------------------------------------------------------- END;
/
Enqueue Message
Use the DBMS_AQ.ENQUEUE procedure to write messages to the queue:
enqueue_message.sql
CONNECT aq_user_plsql/aq_user_plsql SET SERVEROUTPUT ON DECLARE enqueue_options dbms_aq.enqueue_options_t;
message_properties dbms_aq.message_properties_t;
message_handle RAW(16);
message aq_admin_plsql.message_type;
message_id NUMBER; BEGIN -- ------------------------------------------------------- SELECT aq_admin_plsql.message_seq.nextval
INTO message_id
FROM dual; -- ------------------------------------------------------- message := AQ_ADMIN_PLSQL.MESSAGE_TYPE (
message_id
, 'Subject: EXAMPLE MESSAGE'
, 'Message: THIS IS A SAMPLE MESSAGE.'
, 10.2
); -- ------------------------------------------------------- enqueue_options.VISIBILITY := DBMS_AQ.ON_COMMIT;
enqueue_options.SEQUENCE_DEVIATION := null; -- ------------------------------------------------------- message_properties.PRIORITY := -5;
message_properties.DELAY := DBMS_AQ.NO_DELAY;
message_properties.EXPIRATION := DBMS_AQ.NEVER;
message_properties.CORRELATION := 'TEST MESSAGE'; -- ------------------------------------------------------- DBMS_AQ.ENQUEUE (
queue_name => 'aq_admin_plsql.msg_queue'
, enqueue_options => enqueue_options
, message_properties => message_properties
, payload => message
, msgid => message_handle
); -- ------------------------------------------------------- COMMIT; -- ------------------------------------------------------- END;
/
Dequeue Message
Use the DBMS_AQ.DEQUEUE procedure to read messages from the queue:
dequeue_message.sql
CONNECT aq_user_plsql/aq_user_plsql SET SERVEROUTPUT ON DECLARE dequeue_options dbms_aq.dequeue_options_t;
message_properties dbms_aq.message_properties_t;
message_handle RAW(16);
message aq_admin_plsql.message_type; BEGIN -- ------------------------------------------------------- dequeue_options.CONSUMER_NAME := NULL;
dequeue_options.DEQUEUE_MODE := DBMS_AQ.REMOVE;
dequeue_options.NAVIGATION := DBMS_AQ.NEXT_MESSAGE;
dequeue_options.VISIBILITY := DBMS_AQ.IMMEDIATE;
dequeue_options.WAIT := DBMS_AQ.FOREVER;
dequeue_options.MSGID := null;
dequeue_options.CORRELATION := 'TEST MESSAGE'; -- ------------------------------------------------------- DBMS_AQ.DEQUEUE (
queue_name => 'aq_admin_plsql.msg_queue'
, dequeue_options => dequeue_options
, message_properties => message_properties
, payload => message
, msgid => message_handle
); -- ------------------------------------------------------- dbms_output.put_line('+-----------------+');
dbms_output.put_line('| MESSAGE PAYLOAD |');
dbms_output.put_line('+-----------------+');
dbms_output.put_line('- Message ID := ' || message.message_id);
dbms_output.put_line('- Subject := ' || message.subject);
dbms_output.put_line('- Message := ' || message.text);
dbms_output.put_line('- Dollar Value := ' || message.dollar_value); -- ------------------------------------------------------- COMMIT; -- ------------------------------------------------------- END;
/Script Output Connected.
+-----------------+
| MESSAGE PAYLOAD |
+-----------------+
- Message ID := 1000
- Subject := Subject: EXAMPLE MESSAGE
- Message := Message: THIS IS A SAMPLE MESSAGE.
- Dollar Value := 10.2 PL/SQL procedure successfully completed.
Dropping All Objects
drop_aq_objects.sql
connect aq_admin_plsql/aq_admin_plsql EXECUTE dbms_aqadm.stop_queue(queue_name => 'aq_admin_plsql.msg_queue');
EXECUTE dbms_aqadm.drop_queue(queue_name => 'aq_admin_plsql.msg_queue');
EXECUTE dbms_aqadm.drop_queue_table(queue_table => 'aq_admin_plsql.msg_qt'); DROP TYPE aq_admin_plsql.message_type; DROP SEQUENCE aq_admin_plsql.message_seq; connect sys/change_on_install as sysdba DROP USER aq_user_plsql CASCADE;
DROP USER aq_admin_plsql CASCADE;
oracle 高级队列的更多相关文章
- oracle 高级分组
oracle 高级分组 博客分类: 数据库基础 oraclesql 10.高级分组 本章目标: 对于增强的group by需要掌握: 1.使用rollup(也就是roll up累计的意思)操作产生s ...
- oracle检查点队列与增量检查点【转载】
oracle检查点队列与增量检查点 今天是2013-09-04,这几天一直心里安顿不下来,今天还好了,可以自己安静的学习一下oracle,在此记录一下学习笔记.这篇文章我不知道在那转载的,一直都留在我 ...
- oracle高级查询(实例基于scott用户四张表)
oracle高级查询(实例基于scott用户四张表) 分组查询 多表查询 子查询 综合实例 ====================================================== ...
- oracle 高级函数2
原 oracle 高级函数 2017年08月17日 16:44:19 阅读数:1731 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013278 ...
- oracle 高级函数
原 oracle 高级函数 2017年08月17日 16:44:19 阅读数:1731 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013278 ...
- Oracle高级查询之OVER
注释:为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的 oracel的高级用法:rank()/dense_rank() over(partition by ...orde ...
- [转]详解Oracle高级分组函数(ROLLUP, CUBE, GROUPING SETS)
原文地址:http://blog.csdn.net/u014558001/article/details/42387929 本文主要讲解 ROLLUP, CUBE, GROUPING SETS的主要用 ...
- Oracle高级函数
http://www.cnblogs.com/chen1388/archive/2010/07/06/1771919.html decode函数: decode(aa, 1, 'xs', 2, 'ps ...
- oracle检查点队列(checkpoint queue)
buffer cache CBC链 按地址链 LRU 干净buffer LRUW 脏buffer 按照冷热 checkpoint queue:链buffer,①链脏块②按buffer第一次脏的时 ...
- Oracle高级查询,over 用法
注:标题中的红色order by是说明在使用该方法的时候必须要带上order by. 一.rank()/dense_rank() over(partition by ...order by ...) ...
随机推荐
- Appium元素选择 滑动 通知栏
一.根据ID 包名可省略 1.元素的resource id属性 2.唯一标志该元素的值 3.一般最优先根据它来定位 driver.find_element_by_id('io.manong.deve ...
- leetcode 31. 下一个排列 【时间击败 100%】 【内存击败 92.17%】
对于该题,我本来兴致勃勃地想到了两个优化,但从提交结果来看根本看不出来有什么区别,但我发4我说的都是真的 -3- 1 public void nextPermutation(int[] nums) { ...
- [JavaScript]对象数组 - 不完全整理
对象数组中查询属性为某个值的对象,使用Array.find() const array1 = [5, 12, 8, 130, 44]; const found = array1.find(elemen ...
- ASP.NET Core http请求内容过大, IIS服务器 返回 Request Too Long 解决方案
1.修改web.config文件内容如下: <?xml version="1.0" encoding="utf-8"?> <configura ...
- 【易语言】exui超级列表框使用方法
优秀例程1 黑鸟 https://jiucaiwl.lanzoum.com/iLq8B0oswkuf
- c# string.format 中使用$的坑
string a = "hello}"; string s = string.Format($"{a}"); 上面这种情况,会报格式错误,会把hello}中的} ...
- Java-net
Java网络编程 相关概念: IP地址 端口 socket 理论 TCP 区分服务端和客户端 服务端: (1)创建ServerSocket对象,传入监听的端口号 (2)等待客户端的连接,调用accep ...
- openssl命令学习笔记--第一周
开始学习openssl命令,目前处于啥也不懂的状态.因为不是所有命令都能找到详尽的使用方法(部分可能因为版本问题,甚至找不到对应功能).仅为我那可怜兮兮的7条命令做个学习记录. 一.在linux环境下 ...
- notepad++解决粘贴复制代码行数问题
一.打开 Notepad++,按住 Alt,鼠标点击拖出选择框,这个是列选方法.如图: 然后删除即可 二. 1.将带行数的代码粘贴复制到notepad++中: 2.按ctrl+f,选中替换,选中正则表 ...
- 关于idea2021.1版本的左边不显示bpmn Editor的问题
我这里是自定义主题风格出现的问题 idea左上角File→选择setting→找到Color Scheme菜单,将主题颜色改为IntelliJ Light.在重启idea就好
AQ_ADMINISTRATOR_ROLE