Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да получите известие от базата данни до C++ приложение

Един подход е да използвате Oracle's Advanced Queuing . За тази цел трябва да настроите опашка (и таблица с опашка) и да напишете PL/SQL процедура, която чака следващото съобщение в опашката.

След това страната на C++ извиква PL/SQL процедурата, която се връща, когато настъпи следващото събитие.

От страна на Oracle ще трябва да използвате DBMS_SCHEDULER или подобно средство за създаване на събитието , т.е. да вмъкнете ново съобщение в опашката в подходящия момент.

Това все още е подход на анкетиране. Между две събития обаче няма абсолютно никаква активност.

Актуализация:

Ето примерен код.

Първоначална настройка на опашката (съобщението съдържа числова и текстова стойност):

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;
/

Заглавка на пакета:

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;
/

Тяло на пакета:

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;
/

Сървърът на базата данни може да изпрати съобщение, използвайки следния код:

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

C++ сървърът може да изчака съобщение (и да го получи), извиквайки съхранения sample_queue_pkg.get_next_msg . Параметърът i_max_wait определя максималното време за изчакване на следващото съобщение в секунди. Вероятно искате да приложите цикъл, който чака следващото съобщение и го обработва, докато не получи сигнал, че сървърът е на път да излезе.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Общо нагоре Междинна сума в табличен изглед

  2. Как да избегнем грешки при мутиране на таблицата

  3. Изключение на Java Oracle - максималният брой изрази в списък е 1000

  4. Permgen Memory Leak с горещо повторно разполагане и база данни на Oracle

  5. Актуализирайте и вмъкнете записи в таблицата на Oracle с помощта на OracleDataAdapter от DataTable