Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Cara mendapatkan notifikasi database ke aplikasi C++

Salah satu pendekatan adalah dengan menggunakan Antrian Lanjutan Oracle . Untuk tujuan itu, Anda perlu menyiapkan antrian (dan tabel antrian) dan menulis prosedur PL/SQL yang menunggu pesan berikutnya dalam antrian.

Sisi C++ kemudian memanggil prosedur PL/SQL, yang kembali ketika peristiwa berikutnya telah terjadi.

Di sisi Oracle, Anda harus menggunakan DBMS_SCHEDULER atau fasilitas serupa untuk membuat acara , yaitu untuk memasukkan pesan baru ke dalam antrian pada waktu yang tepat.

Ini masih pendekatan polling. Namun, sama sekali tidak ada aktivitas di antara dua peristiwa.

Pembaruan:

Berikut beberapa contoh kode.

Pengaturan awal antrian (pesan berisi nilai numerik dan teks):

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

Judul paket:

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

Isi paket:

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

Server database dapat mengirim pesan menggunakan kode berikut:

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

Server C++ dapat menunggu pesan (dan menerimanya) memanggil sample_queue_pkg.get_next_msg yang tersimpan . Parameter i_max_wait menentukan waktu maksimum untuk menunggu pesan berikutnya dalam hitungan detik. Anda mungkin ingin mengimplementasikan loop yang menunggu pesan berikutnya dan memprosesnya hingga menerima sinyal bahwa server akan berhenti.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memasukkan dua baris?

  2. Oracle:Operasi aritmatika menghasilkan overflow

  3. Petualangan Pembelian Ringan

  4. Bagaimana cara membuat indeks teks untuk pencarian '%abc%'?

  5. SQL ROWNUM cara mengembalikan baris di antara rentang tertentu