PL/SQL для dequeeueu и постановки в очередь в ORACLE

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

У меня есть сценарий .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;

Он работает так, как я хочу (надеюсь на это :)), но моя идея состоит в том, чтобы поместить еще один блок кода, который мог бы делать это для всех ОЧЕРЕДЕЙ - он начинался бы с задания несколько раз в день. Нужна помощь, как вставить переменную в имя_очереди и выбрать (имя таблицы). Например, другое имя_очереди — это test1, test2, test3 и соответствующие таблицы.

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

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


person DannyBoy    schedule 16.11.2018    source источник


Ответы (1)


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

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 в ваших операторах постановки в очередь/удаления из очереди.

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

person Shaun Peterson    schedule 18.11.2018