对编码真的很陌生(几天)。我想向您寻求有关我的问题/想法的帮助。
具有用于重新排队过期消息的.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表。
我不想做几个单独运行的脚本,我更喜欢通过一些可以声明队列的选择/配置样式来完成它,它将在我的项目中快速增长。 我真的在寻找您的答案,希望能多了解一些编码。
祝您有美好的一天!
答案 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”或从配置表中将其删除。