Bonjour,

Je tente actuellement de détecter l'arrivée de message dans des queues Oracle.
Un fois détecter je récupère le message afin de l'insérer dans une table.

Création de la table de réception
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
CREATE TABLE messages (message RAW(1000), date_created TIMESTAMP);
Création de la queue de réception
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
DECLARE
   l_q_name              CONSTANT VARCHAR2 (30) := 'MY_QUEUE';
   l_payload_type_name   CONSTANT VARCHAR2 (30) := 'RAW';
BEGIN
        DBMS_AQADM.create_queue_table (
        QUEUE_TABLE                  => l_q_name,
        QUEUE_PAYLOAD_TYPE     => l_payload_type_name,
        MULTIPLE_CONSUMERS     => TRUE,
        COMMENT              => 'My queue');
        DBMS_AQADM.create_queue (
        QUEUE_NAME       => l_q_name,
        QUEUE_TABLE      => l_q_name,
        RETENTION_TIME => 86400, /*24 hours in seconds*/
        COMMENT          => 'My queue');
        DBMS_AQADM.start_queue (queue_name => l_q_name);
   COMMIT;
END;

Création du package et du process de traitement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
CREATE OR REPLACE PACKAGE MY_PACKAGE
AS
   PROCEDURE PROCESS_Q_MSG (p_msg_o IN RAW);
END MY_PACKAGE;
/
CREATE OR REPLACE PACKAGE BODY MY_PACKAGE
AS
   PROCEDURE PROCESS_Q_MSG (p_msg_o IN RAW)
   IS
   BEGIN
      INSERT INTO messages (message, date_created) 
      VALUES (p_msg_o, SYSTIMESTAMP);
   END PROCESS_Q_MSG;
END MY_PACKAGE;
Création du scheduler et du job qui intercepte le message dans la queue et le met dans la table
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
BEGIN
  DBMS_SCHEDULER.create_program (
                          program_name          => 'my_program_p',
                          program_action        => 'MY_PACKAGE.PROCESS_Q_MSG',
                          program_type          => 'stored_procedure',
                          number_of_arguments   => 1,
                          enabled               => FALSE);
 
   DBMS_SCHEDULER.define_metadata_argument 
                         ('my_program_p', 'event_message', 1);
 
   DBMS_SCHEDULER.enable ('my_program_p');
 
   DBMS_SCHEDULER.create_job (
                                  job_name       => 'my_job_y',
                                  program_name   => 'my_program_p',
                                  queue_spec     => 'MY_QUEUE',
                                  enabled        => FALSE);
 
   DBMS_SCHEDULER.set_attribute ('my_job_y', 'parallel_instances', TRUE);
 
   DBMS_SCHEDULER.enable ('my_job_y');
END;
Insertion du message dans la queue
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
DECLARE 
   enqueue_options     dbms_aq.enqueue_options_t; 
   message_properties  dbms_aq.message_properties_t; 
   message_handle      RAW(16); 
   message             RAW(4096); 
   queue_name      CONSTANT VARCHAR2 (30) := 'MY_QUEUE';
 
BEGIN 
   message :=   utl_raw.cast_to_raw('<person_type>6</person_type><last_name>STARKYSIAN</last_name><first_name>Kara</first_name><name_at_birth>Tully</name_at_birth><date_of_birth>01/03/1970</date_of_birth><title>MS.</title><gender>F</gender><country_of_birth>FR</country_of_birth><place_of_birth>Metz</place_of_birth><nationality_1>FR</nationality_1><civil_status>S</civil_status><event>Birth</event><creator>208144</creator><creation_date>13/08/2015</creation_date><start_date>01/03/2015</start_date>');
   DBMS_AQ.ENQUEUE(
           queue_name => queue_name,            
           enqueue_options    => enqueue_options,        
           message_properties => message_properties,      
           payload  => message,                
           msgid   => message_handle);
    message :=   utl_raw.cast_to_raw('<person_type>6</person_type><last_name>STARKYSIAN</last_name><first_name>Kara</first_name><name_at_birth>Tully</name_at_birth><date_of_birth>01/03/1970</date_of_birth><title>MS.</title><gender>F</gender><country_of_birth>FR</country_of_birth><place_of_birth>Metz</place_of_birth><nationality_1>FR</nationality_1><civil_status>S</civil_status><event>Birth</event><creator>208144</creator><creation_date>13/08/2015</creation_date><start_date>01/03/2015</start_date>');
   DBMS_AQ.ENQUEUE(
           queue_name => queue_name,            
           enqueue_options    => enqueue_options,        
           message_properties => message_properties,      
           payload  => message,                
           msgid   => message_handle);       
   COMMIT; 
END;
Lorsque que je vérifie la queue les messages sont présents par contre la table reste vide et j'ai le message d'erreur suivant dans la table : ALL_SCHEDULER_JOB_RUN_DETAILS
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
ORA-27473: argument 1 does not exist
Merci d'avance pour votre précieuse aide