Отправка сообщения пользователю в Навигатор
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 на непосредственное дёрганье операции отправки сообщения из ТБП Пользователь. |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|