sql >> Databasteknik >  >> RDS >> Oracle

Hur man får databasavisering till C++-applikationen

En metod är att använda Oracles Advanced Queuing . För det ändamålet måste du sätta upp en kö (och en kötabell) och skriva en PL/SQL-procedur som väntar på nästa meddelande i kön.

C++-sidan anropar sedan PL/SQL-proceduren, som återkommer när nästa händelse har inträffat.

På Oracle-sidan måste du använda DBMS_SCHEDULER a> eller en liknande anläggning för att skapa evenemanget , det vill säga att infoga ett nytt meddelande i kön vid lämplig tidpunkt.

Det är fortfarande en opinionsundersökning. Det är dock absolut ingen aktivitet mellan två evenemang.

Uppdatering:

Här är lite exempelkod.

Initial inställning av kön (meddelandet innehåller ett numeriskt värde och ett textvärde):

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

Pakethuvud:

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

Paketets text:

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

Databasservern kan skicka ett meddelande med följande kod:

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

C++-servern kan vänta på meddelanden (och ta emot dem) som anropar den lagrade sample_queue_pkg.get_next_msg . Parametern i_max_wait anger den maximala tiden för att vänta på nästa meddelande i sekunder. Du vill förmodligen implementera en loop som väntar på nästa meddelande och bearbetar det tills det får en signal om att servern är på väg att avslutas.



  1. Uppdatera endast MYSQL-fältet om fältet innehåller null eller 0

  2. Hur man lägger till ett radnummer i en grupp i min fråga

  3. Hur undviker man att lagra referenser för att ansluta till Oracle med JDBC?

  4. Tillhandahåller Oracle en inbyggd valutatabell som jag kan använda som begränsningar?