Sunday, August 3, 2025

enqueue and dequeue

 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