Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Czy można usunąć kolejkę z kolejki ANYDATA Synchronous Capture za pomocą JDBC?

Możesz napisać procedurę składowaną i usunąć wiadomość z kolejki w PL/SQL, przekonwertować ją na tekst XML i zwrócić jako CLOB. Następnie możesz wywołać procedurę składowaną z Javy za pomocą JDBC. Użyłem podobnego obejścia wcześniej, gdy zwykły interfejs API AQ nie miał funkcji.

Przykład:

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;

Działa to, gdy wywołuję go z PL/SQL z odpowiednią kolejką i konsumentem:

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;

Wystarczy wykonać połączenie z Javy z CallableStatement z parametrem clob jako parametrem wyjściowym i powinno być gotowe!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wiersz z najnowszą wartością według klienta i miesiąca

  2. Utwórz użytkownika ze zmiennych łańcuchowych w bloku PL/SQL

  3. ORA-01735:nieprawidłowa opcja ALTER TABLE - Ropucha

  4. Jaka jest różnica między warunkiem NOT a NOT() w Oracle i MS SQL Server?

  5. Klauzula USING w wyroczni 11g