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

Jak uzyskać powiadomienie o bazie danych do aplikacji C++?

Jednym ze sposobów jest użycie Zaawansowanego kolejkowania Oracle . W tym celu musisz ustawić kolejkę (i tabelę kolejek) i napisać procedurę PL/SQL, która czeka na następną wiadomość w kolejce.

Następnie strona C++ wywołuje procedurę PL/SQL, która powraca po wystąpieniu następnego zdarzenia.

Po stronie Oracle będziesz musiał użyć DBMS_SCHEDULER lub podobne narzędzie do tworzenia wydarzenia , tj. wstawić nową wiadomość do kolejki w odpowiednim czasie.

To wciąż podejście ankietowe. Jednak między dwoma wydarzeniami nie ma absolutnie żadnej aktywności.

Aktualizacja:

Oto przykładowy kod.

Wstępna konfiguracja kolejki (wiadomość zawiera wartość liczbową i tekstową):

grant AQ_ADMINISTRATOR_ROLE to appuser;
grant EXECUTE ON DBMS_AQ to appuser;
grant EXECUTE ON DBMS_AQ to appuser;


CREATE TYPE sample_payload_type AS OBJECT
(
  cmd  VARCHAR2(20),
  id   NUMBER
);


BEGIN
  DBMS_AQADM.CREATE_QUEUE_TABLE (
    queue_table        => 'sample_queue_table',
    queue_payload_type => 'sample_payload_type',
    sort_list          => 'ENQ_TIME',
    compatible         => '10.0'
  );
END;
/

BEGIN
  DBMS_AQADM.CREATE_QUEUE (
    queue_name         => 'sample_queue',
    queue_table        => 'sample_queue_table'
  );

  DBMS_AQADM.START_QUEUE (
    queue_name         => 'sample_queue'
  );
END;
/

Nagłówek paczki:

create or replace package sample_queue_pkg
as

  procedure get_next_msg(
    i_max_wait      number
   ,o_cmd      out  varchar2
   ,o_id       out  number
  );


  procedure put_msg(
    i_cmd           varchar2
   ,i_id            number
  );

end sample_queue_pkg;
/

Zawartość opakowania:

create or replace package body sample_queue_pkg
as

  procedure get_next_msg(
    i_max_wait      number
   ,o_cmd      out  varchar2
   ,o_id       out  number
  )
  is
    dequeue_options dbms_aq.dequeue_options_t;
    message_properties dbms_aq.message_properties_t;
    message_handle RAW(16);
    message sample_payload_type;

    NO_MESSAGE_RECEIVED EXCEPTION;
    PRAGMA EXCEPTION_INIT(NO_MESSAGE_RECEIVED, -25228);

  begin
    dequeue_options.wait := i_max_wait;
    DBMS_AQ.DEQUEUE (
      queue_name => 'appuser.sample_queue',
      dequeue_options => dequeue_options,
      message_properties => message_properties,
      payload => message,
      msgid => message_handle
    );

    o_cmd := message.cmd;
    o_id := message.id;

  exception
    when NO_MESSAGE_RECEIVED then
      o_cmd := null;
      o_id := null;

  end get_next_msg;


  procedure put_msg(
    i_cmd           varchar2
   ,i_id            number
  )
  is
    enqueue_options dbms_aq.enqueue_options_t;
    message_properties dbms_aq.message_properties_t;
    message_handle RAW(16);
    message sample_payload_type;
    message_id NUMBER;

  begin
    message := sample_payload_type(i_cmd, i_id);
    DBMS_AQ.ENQUEUE(
      queue_name => 'appuser.sample_queue',
      enqueue_options => enqueue_options,
      message_properties => message_properties,
    payload => message,
      msgid => message_handle
    );
  end put_msg;

end sample_queue_pkg;
/

Serwer bazy danych może wysłać wiadomość przy użyciu następującego kodu:

sample_queue_pkg.put_msg('run_task', 8234);
commit;

Serwer C++ może czekać na wiadomość (i odbierać ją) wywołując przechowywany sample_queue_pkg.get_next_msg . Parametr i_max_wait określa maksymalny czas oczekiwania na następną wiadomość w sekundach. Prawdopodobnie chcesz zaimplementować pętlę, która czeka na następną wiadomość i przetwarza ją, dopóki nie otrzyma sygnału, że serwer zaraz się zakończy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL — Pobieranie wartości z wielu wierszy

  2. Nie mogę znaleźć podpowiedzi na temat „Oracle SQL Developer” i „Oracle Database 12c” w powłoce Linux

  3. Zapytanie SQL zwracające wiersz, nawet jeśli nie zostało znalezione, przynajmniej z parametrami

  4. ORA-01652:nie można rozszerzyć segmentu temp o 128 w tablespace SYSTEM:Jak przedłużyć?

  5. Błąd czasu wykonywania:-2147217887(80040e21) System nie może znaleźć tekstu komunikatu dla numeru komunikatu 0x80040e21 w pliku komunikatu dla OraOLEDB