I can give you a simple working example of enqueue and dequeue with ANYDATAARRAY in Oracle SQL/PLSQL.
-- Queue Table to hold ANYDATA type messages
BEGIN
DBMS_AQADM.CREATE_QUEUE_TABLE (
queue_table => 'test_queue_tab',
queue_payload_type => 'SYS.ANYDATA',
multiple_consumers => FALSE
);
DBMS_AQADM.CREATE_QUEUE (
queue_name => 'test_queue',
queue_table => 'test_queue_tab'
);
DBMS_AQADM.START_QUEUE (
queue_name => 'test_queue'
);
END;
/
--2. Declare a Payload Array in PL/SQL
DECLARE
lv_payload_array SYS.ANYDATAARRAY := SYS.ANYDATAARRAY(); -- initialize empty array
BEGIN
-- Extend and add messages to the array
lv_payload_array.EXTEND(2);
-- Add 2 messages of type VARCHAR2
lv_payload_array(1) := SYS.ANYDATA.ConvertVarchar2('Hello');
lv_payload_array(2) := SYS.ANYDATA.ConvertVarchar2('World');
-- Enqueue each message
FOR i IN 1..lv_payload_array.COUNT LOOP
DBMS_AQ.ENQUEUE(
queue_name => 'test_queue',
enqueue_options => DBMS_AQ.ENQUEUE_OPTIONS_T(),
message_properties => DBMS_AQ.MESSAGE_PROPERTIES_T(),
payload => lv_payload_array(i),
msgid => NULL
);
END LOOP;
COMMIT;
END;
/
--Dequeue Messages
DECLARE
lv_dequeue_options DBMS_AQ.DEQUEUE_OPTIONS_T;
lv_message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
lv_msgid RAW(16);
lv_payload SYS.ANYDATA;
lv_varchar VARCHAR2(100);
BEGIN
lv_dequeue_options.wait := DBMS_AQ.NO_WAIT;
LOOP
BEGIN
DBMS_AQ.DEQUEUE(
queue_name => 'test_queue',
dequeue_options => lv_dequeue_options,
message_properties => lv_message_properties,
payload => lv_payload,
msgid => lv_msgid
);
-- Extract VARCHAR2 value from ANYDATA
IF lv_payload.GetVarchar2(lv_varchar) = DBMS_TYPES.SUCCESS THEN
DBMS_OUTPUT.PUT_LINE('Dequeued: ' || lv_varchar);
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
EXIT; -- No more messages
END;
END LOOP;
END;
/
Output
Dequeued: Hello
Dequeued: World
This is the simplest enqueue/dequeue example using ANYDATAARRAY in Oracle AQ.
No comments:
Post a Comment