PL / SQL для deqeueu и постановки в очередь в ORACLE - PullRequest
0 голосов
/ 16 ноября 2018

Я действительно новичок в кодировании (несколько дней). Я хотел бы попросить вас помочь с моей проблемой / идеей.

У меня есть скрипт .SQL для повторной постановки устаревших сообщений.

DECLARE
    v_en_options              DBMS_AQ.ENQUEUE_OPTIONS_T;
    v_en_message_properties   DBMS_AQ.MESSAGE_PROPERTIES_T;
    v_en_message_handle       RAW (16);
    v_dq_options              DBMS_AQ.DEQUEUE_OPTIONS_T;
    v_dq_message_properties   DBMS_AQ.MESSAGE_PROPERTIES_T;
    v_dq_message_handle       RAW (16);
    v_neeeding                MESSAGE;

    CURSOR x
    IS
        SELECT MSG_ID, corr_id
          FROM test.AQ$TEST_T
         WHERE msg_state = 'EXPIRED';
BEGIN
    FOR MESSAGE IN x
    LOOP
        v_dq_options.msgid := MESSAGE.msg_id;
        DBMS_AQ.dequeue (queue_name           => 'test.AQ$_test_T_E',
                         dequeue_options      => v_dq_options,
                         message_properties   => v_dq_message_properties,
                         payload              => v_needing,
                         msgid                => v_dq_message_handle);

        v_en_message_properties.correlation := MESSAGE.corr_id;
        DBMS_AQ.enqueue (queue_name           => 'test.test_Q',
                         enqueue_options      => v_en_options,
                         message_properties   => v_en_message_properties,
                         payload              => v_needing,
                         msgid                => v_en_message_handle);
    END LOOP;

    COMMIT;
EXCEPTION
    WHEN OTHERS
    THEN
        ROLLBACK;
        RAISE;
END;

это работает так, как я хочу (надеюсь, так :)), но моя идея состоит в том, чтобы поместить еще один блок кода, который мог бы сделать это для всех QUEUES - он начался бы с работы несколькихраз в день.Нужна помощь в том, чтобы вставить переменную в queue_name и select (имя таблицы). Например, другое имя queue_name - это таблицы test1, test2, test3 и coresponding.

Я не хочу делать несколько сценариев, которые будутБудем работать отдельно, я предпочитаю делать это с помощью некоторого стиля select / config, где я могу объявить очередь. В моем проекте это будет очень быстро расти.Я действительно ищу ваш ответ и надеюсь понять немного больше кодирования.

Хорошего дня !!!

1 Ответ

0 голосов
/ 19 ноября 2018

Если я правильно понимаю ваш вопрос, то, как я бы это сделал, это создать простую таблицу с идентификатором, именем таблицы и активным флагом, затем вы можете заполнить имена таблиц в этой таблице или удалить их при необходимости.

create table my_queue_names (my_queue_id number default 0, my_queue_name varchar2(100), active_flag varchar2(1));

Затем введите имена своих очередей

insert into my_queue_names (my_queue_id, my_queue_name, active_flag) values (1, 'test.AQ$_test_T_E', 'Y');

Затем в разделе объявлений объявите курсор, например,

cursor c_queue_tables is
select ID, queue_name for my_queue_names
where aactive_flag = 'Y';

Затем просто используйте цикл for (как у вас для сообщений) и используйте cursor_variable .my_queue_name вместо жесткого кодирования queue_name в ваших операторах enqueue / dequeue.

Затем, когда у вас появляется новая очередь, вы просто вставляете ее в созданную вами таблицу конфигурации, и она начинает обрабатываться. Если вы хотите отключить только один, вы можете просто установить для active_flag значение «N» ИЛИ удалить его из таблицы конфигурации.

...