Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Orcale 11g DBMS_CHANGE_NOTIFICATION обработчик регистрирует не предсказуемое число записей  [new]
NecroArt
Member

Откуда:
Сообщений: 77
Здравствуйте.
Недавно начал работать с этим пакетом, прекрасно получается регистрировать объкты по одному и обрабатывать уведомления.
Но решил попробовать зарегистрировать две таблицы. Использовал этот туториал. В итоге при регистрации регистрируется только таблица Т2. Код никак не меняю, работаю в той же схеме, в которой получалось регистрировать одну таблицу. Кто-нибудь может предположить, в чём причина?

Также второй вопрос:
регистрирую свои две таблицы:

DECLARE
  REGDS      SYS.CHNF$_REG_INFO;
  regid      NUMBER;
  mgr_id     artemvc.users.user_id%type;
  dept_id    NUMBER;
  qosflags   NUMBER;
BEGIN
 qosflags := DBMS_CHANGE_NOTIFICATION.QOS_RELIABLE +
         DBMS_CHANGE_NOTIFICATION.QOS_ROWIDS;
REGDS := SYS.CHNF$_REG_INFO ('artemvc.chnf_callback', qosflags, 0,0,0);
regid := DBMS_CHANGE_NOTIFICATION.NEW_REG_START (REGDS);
SELECT u.user_id INTO mgr_id FROM artemvc.users u, artemvc.notification_lists WHERE rownum = 1;
DBMS_CHANGE_NOTIFICATION.REG_END;


Сам обработчик:
CREATE OR REPLACE PROCEDURE chnf_callback(ntfnds IN SYS.CHNF$_DESC) IS
   regid           NUMBER;
   event_type      NUMBER;
   numtables       NUMBER;
   operation_type  NUMBER;
   numrows         NUMBER;
   row_id          VARCHAR2(20);
   table_name      VARCHAR2(60);
   
   gotten_user artemvc.users%rowtype;
   gotten_ntf artemvc.notification_lists%rowtype;
 BEGIN
  regid      := ntfnds.registration_id;
  numtables  := ntfnds.numtables;
  event_type := ntfnds.event_type;
  
  insert into artemvc.notifications (id, message, notification_date, table_name)
         values (regid, 'null', sysdate, 'global');
  commit;
      
  IF (event_type = DBMS_CHANGE_NOTIFICATION.EVENT_OBJCHANGE) THEN
    
    FOR i IN 1..numtables LOOP
      
      operation_type  := ntfnds.table_desc_array(I). Opflags;
      
      IF (bitand(operation_type, DBMS_CHANGE_NOTIFICATION.ALL_ROWS) = 0) THEN
        numrows := ntfnds.table_desc_array(i).numrows;
      ELSE 
        numrows :=0;
      END IF;
      
      table_name := ntfnds.table_desc_array(i).table_name;

      /*---------------------------------------------------------------------*/
      insert into artemvc.notifications (id, message, notification_date, table_name)
             values (regid, '-', sysdate, '-----');
      commit;
      /*---------------------------------------------------------------------*/

    END LOOP;
      
  END IF;
  
END;


При таком обработчике в таблицу notifications заносятся 12 строк при добавлении или удалении по одной строки из отслеживаемых users и notification_lists. Но значения, которые заносятся, берутся из первого инсёрта:
values (regid, 'null', sysdate, 'global').

Если закомментировать три строки в конце тела цикла между комментариями /*----*/, то заносятся только 2 строки со значениями values (regid, 'null', sysdate, 'global').
Как так получается? )
24 сен 13, 07:49    [14875598]     Ответить | Цитировать Сообщить модератору
 Re: Orcale 11g DBMS_CHANGE_NOTIFICATION обработчик регистрирует не предсказуемое число записей  [new]
-2-
Member

Откуда:
Сообщений: 15330
SELECT u.user_id INTO mgr_id FROM artemvc.users u, artemvc.notification_lists WHERE rownum = 1;

С таким запросом не стоит ждать чего-то разумного.
24 сен 13, 08:30    [14875644]     Ответить | Цитировать Сообщить модератору
 Re: Orcale 11g DBMS_CHANGE_NOTIFICATION обработчик регистрирует не предсказуемое число записей  [new]
NecroArt
Member

Откуда:
Сообщений: 77
На самом деле стоит ) Оказывается, обработчик не мог выполнить вставку в цикле из-за того, что в таблице notifications для поля table_name было отведено 10 символов, а была попытка вставить больше. Когда увеличили до 100 - всё заработало )

А почему вы говорите, что с таким запросом не стоит ждать чего-то разумного?
24 сен 13, 08:41    [14875667]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить