【问题标题】:PL/SQL for deqeueu and enqueue in ORACLEORACLE 中 deqeueu 和 enqueue 的 PL/SQL
【发布时间】:2018-11-16 09:13:16
【问题描述】:

我对编码真的很陌生(几天)。我想请你帮忙解决我的问题/想法。

我有 .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和对应的表。

我不想做几个单独运行的脚本,我更喜欢通过一些选择/配置样式来声明队列。它会在我的项目中增长得非常快。 我真的在寻找你的答案,并希望能更多地了解编码。

祝你有美好的一天!!!

【问题讨论】:

    标签: plsql oracle-aq


    【解决方案1】:

    如果我正确地理解了您的问题,我将创建一个带有 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' 或从配置表中删除它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 2012-04-27
      相关资源
      最近更新 更多