sql >> Databasteknik >  >> RDS >> Oracle

Är det möjligt att avköa från ANYDATA Synchronous Capture-kö med JDBC?

Du kan skriva en lagrad procedur och avköa meddelandet i PL/SQL och konvertera det till XML-text och returnera det som en CLOB. Sedan kan du anropa den lagrade proceduren från Java med JDBC. Jag har använt en liknande lösning tidigare när det vanliga AQ API saknade en funktion.

Exempel:

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;

Detta fungerar när jag anropar det från PL/SQL med rätt kö och konsument:

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;

Ring bara anropet från Java med en CallableStatement med en clob som utdataparameter och du borde vara igång!




  1. Hibernate session.beginTransaction() anrop och Mysql Starta transaktion

  2. Hur man läser MySQL binära loggfiler (BinLog) med mysqlbinlog

  3. Varför är resultatet av `select 'a'=0;` 1?

  4. Vad motsvarar LISTAGG (Oracle-databas) i PostgreSQL?