sql >> Database >  >> RDS >> Oracle

Is het mogelijk om de wachtrij van ANYDATA Synchronous Capture te verwijderen met behulp van JDBC?

Je zou een opgeslagen procedure kunnen schrijven en het bericht in PL/SQL uit de wachtrij kunnen halen en het naar XML-tekst kunnen converteren en het als een CLOB terugsturen. Dan kun je de opgeslagen procedure vanuit Java aanroepen met JDBC. Ik heb eerder een soortgelijke oplossing gebruikt toen de gewone AQ API een functie ontbeerde.

Voorbeeld:

create or replace procedure dequeue_lcr(
    p_queue_name   varchar2,
    p_consumer     varchar2,
    p_wait_seconds number,
    p_lcr          out clob) as
  deq_lcr     anydata;
  deq_xml     xmltype;
  msgid       raw(16); 
  deqopt      dbms_aq.dequeue_options_t; 
  mprop       dbms_aq.message_properties_t;
  no_messages exception; 
  pragma exception_init (no_messages, -25228);
begin
  deqopt.consumer_name := p_consumer;
  deqopt.wait := p_wait_seconds;
  deqopt.navigation := dbms_aq.first_message;
  deqopt.dequeue_mode  := dbms_aq.remove;
  begin
    dbms_aq.dequeue( 
      queue_name         =>  p_queue_name,
      dequeue_options    =>  deqopt,
      message_properties =>  mprop,
      payload            =>  deq_lcr,
      msgid              =>  msgid);
     deq_xml := dbms_streams.convert_lcr_to_xml(deq_lcr);
     p_lcr := deq_xml.getclobval();    
     commit;
  exception
    when no_messages then
      p_lcr := null;
  end;
end;

Dit werkt als ik het vanuit PL/SQL aanroep met de juiste wachtrij en consument:

declare
  v_clob clob;
begin
  dequeue_lcr('aqtest.hcb_queue_any', 'LOCAL_AGENT', 5, v_clob);
  if (v_clob is not null) then
    dbms_output.put_line('Data: ' || v_clob);
  else
    dbms_output.put_line('No messages');  
  end if;
end;

Bel gewoon vanuit Java met een CallableStatement met een clob als uitvoerparameter en je zou goed moeten zijn om te gaan!




  1. Rijen met dezelfde kolomwaarden retourneren in MySql

  2. DB-codes voor formulieren instellen

  3. De Chamilo MySQL-database implementeren voor hoge beschikbaarheid

  4. MySQL - EN voorwaarde