CftClub.ru
Клуб специалистов ЦФТ-Банк

Отправка сообщения пользователю в Навигатор

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
kamelusz
Участник


Вступление в Клуб: 13.11.2013
СообщениеСр Ноя 13, 2013 08:32   Отправка сообщения пользователю в Навигатор Ответить с цитатой
Полезность: Нет оценки
Господа, доброе утро. Столкнулся на прошлой неделе с необъяснимой ошибкой. Прошу вашей помощи и разъяснений. Есть следующая процедура, призванная уведомить операциониста в Навигаторе о новом сообщении от клиента. Процедура используется в операции, вызываемой автоматически каждую минуту.
Код:
procedure SendMessages(p_BS3_Client ref [BS3_CLIENT], p_mes VARCHAR2)
is
   si   [sys_diarys]::[get_locks_list].ses_info%type;
begin
   &debug(' SendMessages :: p_BS3_Client=['||p_BS3_Client%id||'] p_mes=['||p_mes||']',1)

   -- проверка на исключение вложенного запроса
   for
   (select bs(ac.[account].[otv].[USERNAME])
                        in ::[BS3_CLIENT], (bs.[array_account] : ac)
                        where p_BS3_Client = bs and bs.[DATE_CLOSE] is null and ac.[account].[DATE_CLOSE] is null)
   loop
      null;
   end loop;                        
   
   &debug('step1',1)
   
   for (select s(S.ID S_ID)
         in VW_USER_SESSIONS%rowtype
         where S.ORA_USER in (select bs(ac.[account].[otv].[USERNAME])
                        in ::[BS3_CLIENT], (bs.[array_account] : ac)
                        where p_BS3_Client = bs and bs.[DATE_CLOSE] is null and ac.[account].[DATE_CLOSE] is null)
   )   
   loop
      &debug(' SendMessages :: loop si.id=['||si.id||']',1)
      if ::[SYS_DIARYS].[GET_LOCKS_LIST].GET_SES_INFO(s.S_ID,SI) then
         if si.registered='1' then
               &debug(' SendMessages :: send_event('||si.id||',-1,'||p_mes||')',1)
               rtl.send_event(si.id,-1,replace(p_mes,RTL.CR$));
         end if;
      end if;      
   end loop;   
exception
   when others then &debug(' p_BS3_Client=['||p_BS3_Client%id||'] '||PRINTFUN.SQLERRM_inf,1)
                &debug(' '||utils.call_stack,10)
end;


Однако периодически процедура генерирует исключение при запросе к VW_USER_SESSIONS.

Кусок лога:
Код:

13:47:33 [OP_BS3_POST]::[OP_BS3_LIB] SendMessages :: p_BS3_Client=[999999999] p_mes=[Заголовок сообщения]
         [OP_BS3_POST]::[OP_BS3_LIB]step1
         [OP_BS3_POST]::[OP_BS3_LIB] p_BS3_Client=[999999999] данные не найдены
         [OP_BS3_POST]::[OP_BS3_LIB] ----- PL/SQL Call Stack -----
           object      line  object
           handle    number  name
         8cf206d70       144  package body IBS.UTILS
         83347a820       244  package body IBS.Z$OP_BS3_POST_OP_BS3_LIB
         83cf7f738       139  package body IBS.Z$OP_BS3_POST_NEW#AUTO
         8532ebfa8       149  package body IBS.Z$OP_BS3_POST_OP_BS139551455
         8532ebfa8       325  package body IBS.Z$OP_BS3_POST_OP_BS139551455
         85f015cc0        35  package body IBS.Z$OP_BS3_POST_OP_BS139551448
         87ed998f0         1  anonymous block
         8c3c69420       513  package body IBS.RTL
         8caef65f0       607  package body IBS.Z$SYSTEM_JOBS_JOB_LIB
         859c84118         1  anonymous block


Выполнение этого же запроса в SQL*Plus возвращает нужный результат. При попытке повторить ошибку в тестевой базе операция отрабатывает нормально без каких-либо ошибок. Какой-либо закономерности или периодичности появления ошибки не выявлено - может появиться в любой момент независимо от номера клиента, его сообщения, номера операциониста и фазы луны.
Подскажите пожалуйста, в какой стороне стоит искать причину проблемы и инструмент борьбы с ней.
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеСр Ноя 13, 2013 10:55    Ответить с цитатой
Полезность: Нет оценки
может просто перехватывать ошибку самому, пока не вернёт как надо?
kamelusz
Участник


Вступление в Клуб: 13.11.2013
СообщениеСр Ноя 13, 2013 11:24    Ответить с цитатой
Полезность: Нет оценки
Alkov пишет:
может просто перехватывать ошибку самому, пока не вернёт как надо?


Спасибо за совет. Возьму на вооружение в качестве крайнего варианта - уж очень сильно напоминает костыль.
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеСр Ноя 13, 2013 11:30    Ответить с цитатой
Полезность: Нет оценки
Вот же вполне понятная ошибка.
Цитата:

[OP_BS3_POST]::[OP_BS3_LIB] p_BS3_Client=[999999999] данные не найдены


нету записи с ID 999999999. не надо звать функцию SendMessages с таким значением ссылки p_BS3_Client. Считать id с несуществующей записи невозможно.
kamelusz
Участник


Вступление в Клуб: 13.11.2013
СообщениеСр Ноя 13, 2013 11:40    Ответить с цитатой
Полезность: Нет оценки
devor пишет:
нету записи с ID 999999999. не надо звать функцию SendMessages с таким значением ссылки p_BS3_Client. Считать id с несуществующей записи невозможно.


Я при копировании лога на форум вручную заменил ид клиента и тему сообщения от клиента. По факту процедура, конечно же, вызывается с существующим ид.
Ezhik
Участник со стажем


Вступление в Клуб: 17.04.2009
СообщениеСр Ноя 13, 2013 12:47    Ответить с цитатой
Полезность: Нет оценки
Есть стэк ошибки. Может быть его стоит раскрутить?
Тип [BS3_CLIENT], к сожалению, мне незнаком...
bizon-86
Участник


Вступление в Клуб: 16.02.2012
СообщениеВс Дек 01, 2013 02:58    Ответить с цитатой
Полезность: Нет оценки
Всем привет! судя по логу не выводится даже это
&debug(' SendMessages :: loop si.id=['||si.id||']',1) , т.е. падает раньше, как будто в цикле рушится в этом

for (select s(S.ID S_ID)
in VW_USER_SESSIONS%rowtype
where S.ORA_USER in (select bs(ac.[account].[otv].[USERNAME])
in ::[BS3_CLIENT], (bs.[array_account] : ac)
where p_BS3_Client = bs and bs.[DATE_CLOSE] is null and ac.[account].[DATE_CLOSE] is null)
)
NO_DATA_FOUND по идее не должно выдаваться, но может взгляните на пакет, может там VW_USER_SESSIONS обрабатывается\проверяется как-то хитро? Убрать %rowtype у VW_USER_SESSIONS ? Пока ума не приложу что еще может быть...
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеСр Дек 04, 2013 04:58    Ответить с цитатой
Полезность: Нет оценки
bizon-86 пишет:
Всем привет! судя по логу не выводится даже это
&debug(' SendMessages :: loop si.id=['||si.id||']',1) , т.е. падает раньше, как будто в цикле рушится в этом

for (select s(S.ID S_ID)
in VW_USER_SESSIONS%rowtype
where S.ORA_USER in (select bs(ac.[account].[otv].[USERNAME])
in ::[BS3_CLIENT], (bs.[array_account] : ac)
where p_BS3_Client = bs and bs.[DATE_CLOSE] is null and ac.[account].[DATE_CLOSE] is null)
)
NO_DATA_FOUND по идее не должно выдаваться, но может взгляните на пакет, может там VW_USER_SESSIONS обрабатывается\проверяется как-то хитро? Убрать %rowtype у VW_USER_SESSIONS ? Пока ума не приложу что еще может быть...


Что-то не пойму я, как вы собираетесь без %rowtype обращаться к представлению... это синтаксис языка, как бы.

Что до меня, то я бы начал с того, что взял бы текст vw_user_session, если вы так уж уверены, что дело в нём, там 5 объединённых запросов, вот сделал бы 5 разных циклов.
kamelusz
Участник


Вступление в Клуб: 13.11.2013
СообщениеСр Дек 04, 2013 06:38    Ответить с цитатой
Полезность: Нет оценки
Собственно решилось заменой в данной процедуре VW_USER_SESSIONS на непосредственное дёрганье операции отправки сообщения из ТБП Пользователь.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru