Процедура получения информации о просроченных сообщениях очереди для сервиса

This commit is contained in:
Mikhail Chechnev 2019-01-07 01:46:59 +03:00
parent 77a113238b
commit 3bcfb6d39c

View File

@ -292,6 +292,13 @@ create or replace package PKG_EXS as
RCSERVICE out sys_refcursor -- Êóðñîð ñî ñïèñêîì ñåðâèñîâ
);
/* Получение информации о просроченных сообщениях очереди для сервиса */
procedure SERVICE_QUEUE_EXPIRED_GET
(
NEXSSERVICE in number, -- Рег. номер записи сервиса
RCSERVICE_QUEUE_EXPIRED out sys_refcursor -- Курсор со сведениями о просроченных сообщениях сервиса
);
/* Ïîëó÷åíèå êîíòåêñòà ñåðâèñà */
procedure SERVICE_CTX_GET
(
@ -1237,6 +1244,66 @@ create or replace package body PKG_EXS as
RNLIST_BASE_CLEAR(NIDENT => NIDENT);
end SERVICE_GET;
/* Получение информации о просроченных сообщениях очереди для сервиса */
procedure SERVICE_QUEUE_EXPIRED_GET
(
NEXSSERVICE in number, -- Рег. номер записи сервиса
RCSERVICE_QUEUE_EXPIRED out sys_refcursor -- Курсор со сведениями о просроченных сообщениях сервиса
)
is
/* Локальные константы */
NMAX_SINFO_LIST_LEN constant PKG_STD.TNUMBER := 4000; -- Максимальная длинна списка с информацией о просроченных сообщениях
SDELIM constant varchar2(10) := chr(10); -- Разделитель списка с информацией о просроченных сообщениях
/* Локальные переменные */
REXSSERVICE EXSSERVICE%rowtype; -- Запись сервиса
NCNT PKG_STD.TNUMBER := 0; -- Количество просроченных сообщений
SINFO_LIST PKG_STD.TSTRING; -- Список с информацией о просроченных сообщениях
SPREF PKG_STD.TSTRING; -- Возвращаемый префикс списка с информацией о просроченных сообщениях
SPREF_FULL PKG_STD.TSTRING; -- Префикс полного списка с информацией о просроченных сообщениях
SPREF_SOME PKG_STD.TSTRING; -- Префикс неполного (если не вся информация вошла) списка с информацией о просроченных сообщениях
begin
/* Считаем запись сервиса */
REXSSERVICE := GET_EXSSERVICE_ID(NFLAG_SMART => 0, NRN => NEXSSERVICE);
/* Инициализируем префексы */
SPREF_FULL := 'Список просроченных сообщений обмена для сервиса "' || REXSSERVICE.CODE || '":' || CHR(10);
SPREF_SOME := 'Наиболее поздние сообщения обмена из числа просроченных для сервиса "' || REXSSERVICE.CODE || '":' ||
CHR(10);
SPREF := SPREF_FULL;
/* Обходим все сообщения в любом статусе, кроме финальных, для которых установлен лимит нахождения в очереди и он превышен */
for C in (select 'Р/н: ' || TO_CHAR(Q.RN) || ', ф-я: ' || FN.CODE || ', от ' ||
TO_CHAR(Q.IN_DATE, 'dd.mm.yyyy hh24:mi:ss') SINFO
from EXSSERVICEFN FN,
EXSMSGTYPE MT,
EXSQUEUE Q
where FN.PRN = REXSSERVICE.RN
and FN.EXSMSGTYPE = MT.RN
and FN.RN = Q.EXSSERVICEFN
and MT.MAX_IDLE > 0
and Q.EXEC_STATE not in (NQUEUE_EXEC_STATE_OK, NQUEUE_EXEC_STATE_ERR)
and ROUND(24 * 60 * (sysdate - Q.IN_DATE)) > MT.MAX_IDLE
order by Q.IN_DATE)
loop
/* Инкремент количества */
NCNT := NCNT + 1;
/* Собираем информацию в список */
if ((NVL(LENGTH(SINFO_LIST), 0) + LENGTH(C.SINFO) + LENGTH(SDELIM) +
GREATEST(NVL(LENGTH(SPREF_FULL), 0), NVL(LENGTH(SPREF_SOME), 0))) <= NMAX_SINFO_LIST_LEN) then
if (SINFO_LIST is null) then
SINFO_LIST := C.SINFO;
else
SINFO_LIST := SINFO_LIST || SDELIM || C.SINFO;
end if;
else
SPREF := SPREF_SOME;
end if;
end loop;
/* Возвращаем ответ в виде курсора */
open RCSERVICE_QUEUE_EXPIRED for
select NCNT "nCnt",
DECODE(NCNT, 0, null, SPREF || SINFO_LIST) "sInfoList"
from DUAL;
end SERVICE_QUEUE_EXPIRED_GET;
/* Ïîëó÷åíèå êîíòåêñòà ñåðâèñà */
procedure SERVICE_CTX_GET
(