高级队列操作

简介: grant aq_administrator_role to test; begin   dbms_aqadm.grant_type_access('test'); end;  create or replace type messageobj as object (   title ...

grant aq_administrator_role to test;

begin
  dbms_aqadm.grant_type_access('test');
end; 

create or replace type messageobj as object
(
  title varchar2(30),
  data1 number,
  data2 varchar2(100),
  data3 date,
 
  member procedure print(v_Message in varchar2)
);

create or replace type body MessageObj as
  member procedure print(v_Message in varchar2) is
  begin
    dbms_output.put_line(v_Message || ':'||title);
    dbms_output.put_line('Data 1:' || data1);
    dbms_output.put_line('Data 2:' || data2);
    dbms_output.put_line('Data 3:' || data3);
  end print;
end;
 
   -- prompt SimpleQ...
  begin
    --Create a simple table,with all of the defaults.This will allow
    --FIFO queues,with no message grouping or multiple consumers.
    dbms_aqadm.create_queue_table(
      queue_table=>'SimpleQTab',   
      queue_payload_type=>'MessageObj',
      comment=>'Simple Queue Table');
    dbms_aqadm.create_queue(
      queue_name=>'SimpleQ',
      queue_table=>'SimpleQTab',
      comment=>'Simple Queue');
    --Enable enqueue and dequeue within operations simpleQ.
    dbms_aqadm.create_queue(
      queue_name=>'ExceptionQ',
      queue_table=>'SimpleQTab',
      queue_type=>dbms_aqadm.exception_queue,
      comment=>'Exception Queue');
    --Enable dequeue operations for exceptionQ.
    dbms_aqadm.start_queue('ExceptionQ',False,true);
    end;
   
    begin
      --create a priority queue table,by sqecitying the sort order.
      --this queue has no message grouping or multiple consumers.
      dbms_aqadm.create_queue_table(
        queue_table=>'PriorityQTab',
        queue_payload_type=>'MessageObj',
        sort_list=>'priority,enq_time',
        comment=>'Priority queue table');
      dbms_aqadm.create_queue(
        queue_name=>'PriorityQ',
        queue_table=>'PriorityQTab',
        comment=>'Priority Queue');
       
      --Enable enqueue and dequeue operations for priorityq.
      dbms_aqadm.start_queue('PriorityQ');
    end;

--enqueue and dequeue opertion   
declare
  v_Message MessageObj;
  v_EnqueueOptions dbms_aq.enqueue_options_t;
  v_DequeueOptions dbms_aq.dequeue_options_t;   
  v_MessageProperties dbms_aq.message_properties_t;
  v_msgid raw(16);
  c_numMessages constant integer:=10;
 
  e_QTimeOut exception;
  pragma exception_init(e_QTimeOut,-25228);
 
  begin
    for v_Counter in 1..c_NumMessages loop
      --Create a message to enqueue.
      v_message := messageobj('Message'||v_counter,v_counter*10,'abcdefghijklmnopqrstuvwxyz',sysdate+v_counter);
     
      --enqueue it with the default options.
      dbms_aq.enqueue(
        queue_name => 'SimpleQ',
        enqueue_options => v_enqueueOptions,
        message_properties => v_messageproperties,
        payload =>v_message,
        msgid =>v_msgid);
    end loop;
    --commit all the enqueue.
    commit;
   
    --loop until there are no more message to dequeue.
    begin
      loop
        --dequeue the first message into v_message,waiting a maximum
        --of 1 second.
        v_dequeueOptions.wait :=1;
        dbms_aq.dequeue(
          queue_name =>'SimpleQ',
          dequeue_options =>v_dequeueOptions,
          message_properties =>v_messageProperties,
          payload =>v_message,
          msgid => v_msgid);
     
        --and print it.
        v_message.print('after dequeue');
      end loop;
    exception
      when e_QTimeOut then
        --end of the queue reached
        null;
    end;
    --commit all the dequeue.
   
    commit;
  end;
输出结果:
after dequeue:Message1
Data 1:10
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:27-11月-07
after dequeue:Message2
Data 1:20
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:28-11月-07
after dequeue:Message3
Data 1:30
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:29-11月-07
after dequeue:Message4
Data 1:40
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:30-11月-07
after dequeue:Message5
Data 1:50
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:01-12月-07
after dequeue:Message6
Data 1:60
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:02-12月-07
after dequeue:Message7
Data 1:70
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:03-12月-07
after dequeue:Message8
Data 1:80
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:04-12月-07
after dequeue:Message9
Data 1:90
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:05-12月-07
after dequeue:Message10
Data 1:100
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:06-12月-07
  
 
--priority enqueue and dequeue opertion   
declare
  v_Message MessageObj;
  v_EnqueueOptions dbms_aq.enqueue_options_t;
  v_DequeueOptions dbms_aq.dequeue_options_t;   
  v_MessageProperties dbms_aq.message_properties_t;
  v_msgid raw(16);
  c_numMessages constant integer:=10;
 
  e_QTimeOut exception;
  pragma exception_init(e_QTimeOut,-25228);
 
  begin
    for v_Counter in 1..c_NumMessages loop
      --Create a message to enqueue.
      v_message := messageobj('Message'||v_counter,v_counter*10,'abcdefghijklmnopqrstuvwxyz',sysdate+v_counter);
     
      --enqueue it with priority equal to v_counter.thus the last message to be enqueueed will have highest priority
      v_MessageProperties.priority := -v_counter;
      dbms_aq.enqueue(
        queue_name => 'PriorityQ',
        enqueue_options => v_enqueueOptions,
        message_properties => v_messageproperties,
        payload =>v_message,
        msgid =>v_msgid);
    end loop;
    --commit all the enqueue.
    commit;
   
    --loop until there are no more message to dequeue.
    begin
      loop
        --dequeue the first message into v_message,waiting a maximum
        --of 1 second.
        v_dequeueOptions.wait :=1;
        dbms_aq.dequeue(
          queue_name =>'PriorityQ',
          dequeue_options =>v_dequeueOptions,
          message_properties =>v_messageProperties,
          payload =>v_message,
          msgid => v_msgid);
     
        --and print it.
        v_message.print('after dequeue');
      end loop;
    exception
      when e_QTimeOut then
        --end of the queue reached
        null;
    end;
    --commit all the dequeue.
   
    commit;
  end; 

输出结果:
after dequeue:Message10
Data 1:100
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:06-12月-07
after dequeue:Message9
Data 1:90
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:05-12月-07
after dequeue:Message8
Data 1:80
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:04-12月-07
after dequeue:Message7
Data 1:70
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:03-12月-07
after dequeue:Message6
Data 1:60
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:02-12月-07
after dequeue:Message5
Data 1:50
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:01-12月-07
after dequeue:Message4
Data 1:40
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:30-11月-07
after dequeue:Message3
Data 1:30
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:29-11月-07
after dequeue:Message2
Data 1:20
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:28-11月-07
after dequeue:Message1
Data 1:10
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:27-11月-07


 --簡單的enqueue和dequeue操作
DECLARE
  v_Message MessageObj;
  v_EnqueueOptions dbms_aq.enqueue_options_t;
  v_DequeueOptions dbms_aq.dequeue_options_t;
  v_messageProperties dbms_aq.message_properties_t;
  v_MsgID RAW(16);
  c_numMessages CONSTANT INTEGER :=10;
  e_QTimeOut EXCEPTION;
  PRAGMA EXCEPTION_INIT(e_QTimeOut,-25228);
BEGIN
  FOR v_Counter IN 1..c_NumMessages LOOP
    --Create a message to enqueue.
    v_Message :=MessageObj('Message'||v_Counter,v_Counter*10,'abcdefghijklmnopqrstuvwxyz',SYSDATE+v_Counter);
   
    --Enqueue it with the default options.
    dbms_aq.enqueue(queue_name => 'SimpleQ',
      enqueue_options => v_enqueueoptions,
      message_properties => v_messageProperties,
      payload => v_Message,
      msgid => v_MsgID);
  END LOOP;
 
  --commit all the enqueue.
  COMMIT;
 
  --loop until there are no more message to dequeue.
  BEGIN
    LOOP
      --dequeue the first message into v_message,waiting a maximum of 1 second.
      v_DequeueOptions.WAIT := 1 ;
      dbms_aq.dequeue(queue_name => 'SimpleQ',
        dequeue_options => v_DequeueOptions,
        message_properties => v_messageProperties,
        payload => v_message,
        msgid => v_MsgID);
      --and print it.
      v_message.print('after dequeue');
    END LOOP;
  EXCEPTION
    WHEN e_QTimeOut THEN
      --end of the queue reached
      NULL;
  END;
  --commit all the dequeue.
  COMMIT;
                  
END;   

輸出結果
after dequeue:Message1
Data 1:10
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:02-12月-07
after dequeue:Message2
Data 1:20
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:03-12月-07
after dequeue:Message3
Data 1:30
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:04-12月-07
after dequeue:Message4
Data 1:40
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:05-12月-07
after dequeue:Message5
Data 1:50
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:06-12月-07
after dequeue:Message6
Data 1:60
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:07-12月-07
after dequeue:Message7
Data 1:70
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:08-12月-07
after dequeue:Message8
Data 1:80
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:09-12月-07
after dequeue:Message9
Data 1:90
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:10-12月-07
after dequeue:Message10
Data 1:100
Data 2:abcdefghijklmnopqrstuvwxyz
Data 3:11-12月-07

目录
相关文章
|
SQL Oracle 关系型数据库
SQL与PL/SQL:数据库编程语言的比较
【8月更文挑战第31天】
396 1
|
12月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
11月前
|
SQL 数据采集 监控
局域网监控电脑屏幕软件:PL/SQL 实现的数据库关联监控
在当今网络环境中,基于PL/SQL的局域网监控系统对于企业和机构的信息安全至关重要。该系统包括屏幕数据采集、数据处理与分析、数据库关联与存储三个核心模块,能够提供全面而准确的监控信息,帮助管理者有效监督局域网内的电脑使用情况。
139 2
|
前端开发 API 数据库
面试官问:如何防止重复提交请求,99%的前端能说出来!
如何防止接口重复提交是一个常见的系统设计问题,主要目的是确保关键操作的原子性和一致性。以下是简化的摘要: 这些方法可以单独或组合使用,取决于系统规模和业务需求。例如,对于低流量系统,简单的请求唯一ID和数据库唯一索引可能足够;而对于高并发场景,可能需要结合前端禁用和后端分布式锁来提高可靠性。幂等性设计是确保接口安全的一种通用策略,适用于各种场景。
|
监控 Oracle 关系型数据库
Flink CDC 系列 - 实时抽取 Oracle 数据,排雷和调优实践
分享对 Oracle 的实时数据捕获以及性能调优过程中的一些关键细节。
Flink CDC 系列 - 实时抽取 Oracle 数据,排雷和调优实践
|
存储 Unix Shell
Linux【脚本 04】Shell脚本传递参数的4种方式(位置参数、特殊变量、环境变量和命名参数)实例说明
Linux【脚本 04】Shell脚本传递参数的4种方式(位置参数、特殊变量、环境变量和命名参数)实例说明
1436 0
|
SQL Oracle 关系型数据库