Базы данных Oracle - статьи


Oraclexmlmess.shtml - часть 5


Настроить очередь для использования легко. Если у вас есть роль AQ_ADMINISTRATOR_ROLE, вы можете выполнять все необходимые операции для создания, изменения и удаления очередей и таблиц очередей. Если DBA, например SYS, дал вам следующие права, вы сможете все это делать:

connect sys/password GRANT AQ_ADMINISTRATOR_ROLE TO xmlbook; GRANT EXECUTE ON SYS.DBMS_AQADM TO xmlbook; GRANT EXECUTE ON SYS.DBMS_AQ TO xmlbook; GRANT EXECUTE ON SYS.DBMS_AQIN TO xmlbook;

Мы создадим очередь xml_msg_queue для хранения наших XML-сообщений, где они будут поджидать дальнейшей обработки. Очередь связана с соответствующей таблицей, используемой для хранения и предоставления возможности запроса сообщений, стоящих в очереди, поэтому мы сначала создадим таблицу queue, затем очередь, которая живет в этой таблице, запустив следующий анонимный PL/SQL блок:

-- createXMLMessageQueue.sql DECLARE queuetablename VARCHAR2 (30) := 'xml_msg_queuetable'; queuename VARCHAR2 (30) := 'xml_msg_queue'; BEGIN -- Удаляем таблицу очередей, -- игнорируя ошибку, если ее не было BEGIN DBMS_AQADM.drop_queue_table (queuetablename); EXCEPTION WHEN OTHERS THEN NULL; END;

-- Создаем таблицу очередей DBMS_AQADM.create_queue_table ( queue_table=> queuetablename, queue_payload_type=> 'RAW' ); -- Создаем очередь, основанную на данной таблице

DBMS_AQADM.create_queue (queuename,queuetablename); -- Открываем очередь DBMS_AQADM.start_queue (queuename); END;

Обратите внимание, что мы использовали простейший тип очереди, который поддерживает бинарную полезную нагрузку до 32KB, для того, чтобы узнать о механизмах. Когда вы узнаете о том, как работать с XML-сообщениями в этой простейшей очереди, вы обнаружите, что эксперименты с другими возможностями AQ станут гораздо проще. Как мы уже делали с другими связанными с XML технологиями, которые мы планировали использовать снова и снова, давайте построим вспомогательный пакет для работы с XML-сообщениями и дополнительными очередями. На Листинге 7 показана спецификация пакета xmlq. Она очень проста. Она содержит только две подпрограммы: для постановки в очередь – enqueue и для извлечения из очереди – dequeue. Процедура enqueue принимает на вход xmldom.DOMDocument и имя очереди, в которую должно быть поставлено XML-сообщение. Функция dequeue принимает имя очереди и флаг ожидания, и возвращает сообщение из очереди в виде xmldom.DOMDocument.

Реализация пакета xmlq (представленного в Листинге 8) почти также проста, как его спецификация. Единственное о чем стоит упомянуть, это использование функции utl_raw.cast_to_raw для преобразования переданного сообщения XML в блок сырых байтов, и функции utl_raw.cast_to_varchar2 для выполнения обратной операции при извлечении из очереди. Если при вызове функции флаг ожидания имеет значение TRUE, мы устанавливаем соответствующие опции в структуре записи опций извлечения из очереди. Это говорит Oracle AQ о том, что если в очереди нет ожидающих нас сообщений, мы собираемся спать, пока не прибудут сообщения.

Обратите внимание, что в спецификации пакета xmlq мы используем прагму EXCEPTION_INIT, чтобы связать значащее имя исключения, например xmlq.queue_empty, с кодом ошибки, которая возникает, когда мы пытаемся извлечь из очереди сообщение без ожидания, и там нет сообщений.

Можно проиллюстрировать постановку в очередь XML заказов следующим простым анонимным PL/SQL блоком. Он создает и ставит в очередь пять новых XML-сообщений о заказах, вызывая xmlq.enqueue. Каждый заказ выглядит следующим образом <order id="101"/>:




Начало  Назад  Вперед



Книжный магазин