sql >> Database teknologi >  >> RDS >> Oracle

Er det muligt at udsætte køen fra ANYDATA Synchronous Capture-kø ved hjælp af JDBC?

Du kan skrive en lagret procedure og sætte beskeden i kø i PL/SQL og konvertere den til XML-tekst og returnere den som en CLOB. Så kan du kalde den lagrede procedure fra Java med JDBC. Jeg har brugt en lignende løsning før, da den almindelige AQ API manglede en funktion.

Eksempel:

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;

Dette virker, når jeg kalder det fra PL/SQL med den rigtige kø og forbruger:

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;

Bare foretag opkaldet fra Java med et CallableStatement med en clob som outputparameter, og du burde være klar!




  1. For at finde og erstatte undslupne anførselstegn i MySQL-tabellen

  2. Henter ufuldstændigt objekt med Hibernate Mapping som indbygget forespørgsel

  3. En guide til automatiserede cloud-databaseimplementeringer

  4. Psycopg2 :Opret en tabel i en lagret procedure Postgres