sql >> Database teknologi >  >> RDS >> Oracle

Sådan får du databasemeddelelse til C++-applikationen

En tilgang er at bruge Oracle's Advanced Queuing . Til det formål skal du oprette en kø (og en kø-tabel) og skrive en PL/SQL-procedure, der venter på den næste besked i køen.

C++-siden kalder derefter PL/SQL-proceduren, som vender tilbage, når den næste hændelse er indtruffet.

På Oracle-siden skal du bruge DBMS_SCHEDULER a> eller en lignende facilitet til at oprette begivenheden , dvs. at indsætte en ny besked i køen på det passende tidspunkt.

Det er stadig en meningsmålingstilgang. Der er dog absolut ingen aktivitet mellem to begivenheder.

Opdatering:

Her er et eksempel på kode.

Indledende opsætning af køen (meddelelsen indeholder en numerisk og en tekstværdi):

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

Pakkeoverskrift:

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

Pakketekst:

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

Databaseserveren kan sende en besked ved hjælp af følgende kode:

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

C++-serveren kan vente på besked (og modtage dem), der kalder den lagrede sample_queue_pkg.get_next_msg . Parameteren i_max_wait angiver den maksimale tid til at vente på den næste besked i sekunder. Du vil sandsynligvis implementere en loop, der venter på den næste besked og behandler den, indtil den modtager et signal om, at serveren er ved at afslutte.



  1. EXPLAIN og COUNT returnerer to forskellige værdier

  2. Hvordan kan jeg oprette en mappe via Oracle Form Builder?

  3. PHP-databaseoutput viser ikke den rigtige vej

  4. Hvordan undslipper jeg specialtegn i MySQL?