Oracle DBMS_ALERT в Oracle 12c - PullRequest
       14

Oracle DBMS_ALERT в Oracle 12c

0 голосов
/ 18 апреля 2020

У меня есть таблица (my_tab), которая содержит столбец STATUS с указанным идентификатором c в этой же таблице.

Мне нужны средства оповещения через процесс DBMS_ALERT о том, когда STATUS значение изменения столбца.

Я искал использование триггера для срабатывания ALERT, т. е.:

create or replace trigger my_tab_upd after update of status on my_tab for each row
begin
   dbms_alert.signal('mystatusalert', 'changed from '||:old.status||' to '||:new.status||'.');
end;
/

С этим, как я теперь получаю оповещение / уведомление о том, что это изменение STATUS имеет произошло в процедуре PL / SQL, чтобы отключить go и выполнить другую операцию на основе этого изменения STATUS?

В дополнение к вышесказанному, с моей настройкой приложения будет несколько пользователей. Исходя из этого, как можно настроить оповещение для определенных c пользователей / сеансов, чтобы правильный пользователь получал только свои оповещения, а не чьи-либо.

Я смотрю на проверку оповещения из веб-приложения (Oracle APEX), поэтому не нужно блокировать интерфейс, поэтому любые рекомендации по этому поводу будут хорошими.

Пример будет отличным.

1 Ответ

1 голос
/ 18 апреля 2020

Я бы отправил электронное письмо самому себе. Например:

create or replace trigger my_tab_upd 
  after update of status on my_tab 
  for each row
begin
  utl_mail.send (sender     => 'me@company.com',
                 recipients => 'me@company.com',
                 subject    => 'MY_TAB status changed',
                 message    => 'old = ' || :old.status ||', new = ' || :new.status
                );
end;

DBMS_ALERT пример: в схеме Скотта я хочу уведомить мою хранимую процедуру о том, что что-то изменилось в таблице EMP, а затем сделать что-то (Я просто выведу сообщение).

Сначала создайте триггер; имя оповещения alert_emp и будет использоваться позже в хранимой процедуре:

SQL> create or replace trigger trg_au_emp
  2    after update on emp
  3    for each row
  4  begin
  5    dbms_alert.signal
  6      ('alert_emp', 'Salary changed for ' || :new.ename ||
  7                    ' from ' || :old.sal ||
  8                    ' to '   || :new.sal);
  9  end;
 10  /

Trigger created.

Процедура:

SQL> create or replace procedure p_test is
  2    l_msg    varchar2(200);
  3    l_status number;
  4  begin
  5    dbms_alert.register ('alert_emp');
  6    dbms_alert.waitone  ('alert_emp', l_msg, l_status);
  7    dbms_output.put_line(l_msg ||': '|| l_status);
  8  end;
  9  /

Procedure created.

Теперь выполните процедуру:

SQL> exec p_test;

Здесь он просто ожидает, что что-то произойдет в таблице EMP. В другой сессии Я обновляю таблицу. Фиксация обязательна ; в противном случае ничего не происходит. p_test все еще будет ожидать.

update emp set sal = 1000 where empno = 7369;
commit;

В первом сеансе после выполнения commit на экране отображается следующее: PL / SQL процедура успешно завершена.

Salary changed for SMITH from 800 to 1000: 0

PL/SQL procedure successfully completed.

SQL>
...