PL / SQL用于ORACLE中的deqeueu和入队

时间:2018-11-16 09:13:17

标签: plsql oracle-aq

对编码真的很陌生(几天)。我想向您寻求有关我的问题/想法的帮助。

具有用于重新排队过期消息的.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表。

我不想做几个单独运行的脚本,我更喜欢通过一些可以声明队列的选择/配置样式来完成它,它将在我的项目中快速增长。 我真的在寻找您的答案,希望能多了解一些编码。

祝您有美好的一天!

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题的方式是创建一个具有ID和表名以及活动标志的简单表,则可以将表名填充到该表中,或者根据需要将其删除。

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”或从配置表中将其删除。