понедельник, 8 августа 2011 г.

Скрипт создания и удаления очередей в оракле.

Дано:
Схема AQ - содержит очереди.
Схема A - оперирует очередями и содержит процедуру-подписчик, которая будет вызываться во время извлечения задания из очереди


begin
-- создаем таблицу для очереди, multiple_consumers - параметр для мультиподписчиков, queue_payload_type - тип данных, который будет хранится в очереди
dbms_aqadm.create_queue_table(queue_table => 'AQ.DIRECTADMIN_Q_TBL',
queue_payload_type => 'sys.xmltype',
multiple_consumers => true);

-- создаем саму очередь, привязанную к таблице
dbms_aqadm.create_queue(queue_name => 'AQ.DIRECTADMIN_Q',
queue_table => 'AQ.DIRECTADMIN_Q_TBL');

-- выдаем привилегии для нужной схемы
dbms_aqadm.grant_queue_privilege(privilege => 'ALL',
queue_name => 'AQ.DIRECTADMIN_Q',
grantee => 'A',
grant_option => false);
-- выдаем привилегии на таблицу очереди, если нужно
--exec grant select , update, delete on AQ.DIRECTADMIN_Q_TBL to A;

-- запускаем очередь
dbms_aqadm.start_queue(queue_name => 'AQ.DIRECTADMIN_Q');

-- добавляем подписчика к очереди
dbms_aqadm.add_subscriber(queue_name => 'AQ.DIRECTADMIN_Q',
subscriber => sys.aq$_agent('DIRECTADMIN_Q_SUBSCRIBER',
NULL,
NULL));

-- регистрируем подписчика и делаем привязку к процедуре, которая вызовется при извлечении задания
dbms_aq.register(sys.aq$_reg_info_list(sys.aq$_reg_info('AQ.DIRECTADMIN_Q:DIRECTADMIN_Q_SUBSCRIBER',
dbms_aq.namespace_aq,
'PLSQL://A.PKG_QUEUE_CALLBACK.DIRECTADMIN',
HEXTORAW('FF'))),
1);

-- удаление очереди
/* dbms_aqadm.stop_queue(queue_name => 'AQ.DIRECTADMIN_Q');
dbms_aqadm.drop_queue(queue_name => 'AQ.DIRECTADMIN_Q');
dbms_aqadm.drop_queue_table(queue_table => 'AQ.DIRECTADMIN_Q_TBL');*/

end;

-- Ручной запуск обработчика очередей begin dbms_aqadm_sys.register_driver(); end;

Комментариев нет:

Отправить комментарий