Контроль наличия записи при считывании курсора по RN

This commit is contained in:
Mikhail Chechnev 2018-12-03 02:00:48 +03:00
parent e33e0ae2dc
commit f683f44bca

View File

@ -238,6 +238,7 @@ create or replace package PKG_EXS as
/* Ïîëó÷åíèå ñåðâèñà */ /* Ïîëó÷åíèå ñåðâèñà */
procedure SERVICE_GET procedure SERVICE_GET
( (
NFLAG_SMART in number, -- Ïðèçíàê âûäà÷è ñîîáùåíèÿ îá îøèáêå
NEXSSERVICE in number, -- Ðåã. íîìåð çàïèñè ñåðâèñà NEXSSERVICE in number, -- Ðåã. íîìåð çàïèñè ñåðâèñà
RCSERVICE out sys_refcursor -- Êóðñîð ñî ñïèñêîì ñåðâèñîâ RCSERVICE out sys_refcursor -- Êóðñîð ñî ñïèñêîì ñåðâèñîâ
); );
@ -258,6 +259,7 @@ create or replace package PKG_EXS as
/* Ïîëó÷åíèå ôóíêöèè ñåðâèñà */ /* Ïîëó÷åíèå ôóíêöèè ñåðâèñà */
procedure SERVICEFN_GET procedure SERVICEFN_GET
( (
NFLAG_SMART in number, -- Ïðèçíàê âûäà÷è ñîîáùåíèÿ îá îøèáêå
NEXSSERVICEFN in number, -- Ðåã. íîìåð ôóíêöèè ñåðâèñà NEXSSERVICEFN in number, -- Ðåã. íîìåð ôóíêöèè ñåðâèñà
RCSERVICEFN out sys_refcursor -- Êóðñîð ñî ñïèñêîì ôóíêöèé ñåðâèñà RCSERVICEFN out sys_refcursor -- Êóðñîð ñî ñïèñêîì ôóíêöèé ñåðâèñà
); );
@ -288,6 +290,7 @@ create or replace package PKG_EXS as
/* Ñ÷èòûâàíèå çàïèñè æóðíàëà ðàáîòû */ /* Ñ÷èòûâàíèå çàïèñè æóðíàëà ðàáîòû */
procedure LOG_GET procedure LOG_GET
( (
NFLAG_SMART in number, -- Ïðèçíàê âûäà÷è ñîîáùåíèÿ îá îøèáêå
NEXSLOG in number, -- Ðåã. íîìåð çàïèñè æóðíàëà NEXSLOG in number, -- Ðåã. íîìåð çàïèñè æóðíàëà
RCLOG out sys_refcursor -- Êóðñîð ñî ñïèñêîì çàïèñåé æóðíàëà ðàáîòû RCLOG out sys_refcursor -- Êóðñîð ñî ñïèñêîì çàïèñåé æóðíàëà ðàáîòû
); );
@ -313,6 +316,7 @@ create or replace package PKG_EXS as
/* Ñ÷èòûâàíèå ñîîáùåíèÿ èç î÷åðåäè */ /* Ñ÷èòûâàíèå ñîîáùåíèÿ èç î÷åðåäè */
procedure QUEUE_GET procedure QUEUE_GET
( (
NFLAG_SMART in number, -- Ïðèçíàê âûäà÷è ñîîáùåíèÿ îá îøèáêå
NEXSQUEUE in number, -- Ðåã. íîìåð çàïèñè î÷åðåäè NEXSQUEUE in number, -- Ðåã. íîìåð çàïèñè î÷åðåäè
RCQUEUE out sys_refcursor -- Êóðñîð ñ ïîçèöèåé î÷åðåäè RCQUEUE out sys_refcursor -- Êóðñîð ñ ïîçèöèåé î÷åðåäè
); );
@ -973,17 +977,21 @@ create or replace package body PKG_EXS as
/* Ïîëó÷åíèå ñåðâèñà */ /* Ïîëó÷åíèå ñåðâèñà */
procedure SERVICE_GET procedure SERVICE_GET
( (
NEXSSERVICE in number, -- Ðåã. íîìåð çàïèñè ñåðâèñà NFLAG_SMART in number, -- Ïðèçíàê âûäà÷è ñîîáùåíèÿ îá îøèáêå
RCSERVICE out sys_refcursor -- Êóðñîð ñî ñïèñêîì ñåðâèñîâ NEXSSERVICE in number, -- Ðåã. íîìåð çàïèñè ñåðâèñà
RCSERVICE out sys_refcursor -- Êóðñîð ñî ñïèñêîì ñåðâèñîâ
) )
is is
NIDENT PKG_STD.TREF; -- Èäåíòèôèêàòîð áóôåðà REXSSERVICE EXSSERVICE%rowtype; -- Çàïèñü ñåðâèñà
NTMP PKG_STD.TREF; -- Ðåã. íîìåð î÷åðåäíîé çàïèñè áóôåðà NIDENT PKG_STD.TREF; -- Èäåíòèôèêàòîð áóôåðà
NTMP PKG_STD.TREF; -- Ðåã. íîìåð î÷åðåäíîé çàïèñè áóôåðà
begin begin
/* Ñ÷èòàåì çàïèñü ñåðâèñà */
REXSSERVICE := GET_EXSSERVICE_ID(NFLAG_SMART => NFLAG_SMART, NRN => NEXSSERVICE);
/* Ñôîðìèðóåì èäåíòèôèêàòîð áóôåðà */ /* Ñôîðìèðóåì èäåíòèôèêàòîð áóôåðà */
NIDENT := GEN_IDENT(); NIDENT := GEN_IDENT();
/* Ïîëîæèì ðåã. íîìåð ñåðâèñà â áóôåð */ /* Ïîëîæèì ðåã. íîìåð ñåðâèñà â áóôåð */
RNLIST_BASE_INSERT(NIDENT => NIDENT, NDOCUMENT => NEXSSERVICE, NRN => NTMP); RNLIST_BASE_INSERT(NIDENT => NIDENT, NDOCUMENT => NVL(REXSSERVICE.RN, NEXSSERVICE), NRN => NTMP);
/* Çàáèðàåì ñåðâèñ â âèäå êóðñîðà */ /* Çàáèðàåì ñåðâèñ â âèäå êóðñîðà */
SERVICE_GET(NIDENT => NIDENT, RCSERVICE => RCSERVICE); SERVICE_GET(NIDENT => NIDENT, RCSERVICE => RCSERVICE);
/* ×èñòèì áóôåð */ /* ×èñòèì áóôåð */
@ -1063,20 +1071,24 @@ create or replace package body PKG_EXS as
and T.EXSMSGTYPE = M.RN; and T.EXSMSGTYPE = M.RN;
end SERVICEFN_GET; end SERVICEFN_GET;
/* Ïîëó÷åíèå ôóíêöèè ñåðâèñà */ /* Ïîëó÷åíèå ôóíêöèè ñåðâèñà */
procedure SERVICEFN_GET procedure SERVICEFN_GET
( (
NEXSSERVICEFN in number, -- Ðåã. íîìåð ôóíêöèè ñåðâèñà NFLAG_SMART in number, -- Ïðèçíàê âûäà÷è ñîîáùåíèÿ îá îøèáêå
RCSERVICEFN out sys_refcursor -- Êóðñîð ñî ñïèñêîì ôóíêöèé ñåðâèñà NEXSSERVICEFN in number, -- Ðåã. íîìåð ôóíêöèè ñåðâèñà
RCSERVICEFN out sys_refcursor -- Êóðñîð ñî ñïèñêîì ôóíêöèé ñåðâèñà
) )
is is
NIDENT PKG_STD.TREF; -- Èäåíòèôèêàòîð áóôåðà REXSSERVICEFN EXSSERVICEFN%rowtype; -- Çàïèñü ôóíêöèè ñåðâèñà
NTMP PKG_STD.TREF; -- Ðåã. íîìåð î÷åðåäíîé çàïèñè áóôåðà NIDENT PKG_STD.TREF; -- Èäåíòèôèêàòîð áóôåðà
NTMP PKG_STD.TREF; -- Ðåã. íîìåð î÷åðåäíîé çàïèñè áóôåðà
begin begin
/* Ñ÷èòàåì çàïèñü ôóíêöèè ñåðâèñà */
REXSSERVICEFN := GET_EXSSERVICEFN_ID(NFLAG_SMART => NFLAG_SMART, NRN => NEXSSERVICEFN);
/* Ñôîðìèðóåì èäåíòèôèêàòîð áóôåðà */ /* Ñôîðìèðóåì èäåíòèôèêàòîð áóôåðà */
NIDENT := GEN_IDENT(); NIDENT := GEN_IDENT();
/* Ïîëîæèì ðåã. íîìåð ôóíêöèè ñåðâèñà â áóôåð */ /* Ïîëîæèì ðåã. íîìåð ôóíêöèè ñåðâèñà â áóôåð */
RNLIST_BASE_INSERT(NIDENT => NIDENT, NDOCUMENT => NEXSSERVICEFN, NRN => NTMP); RNLIST_BASE_INSERT(NIDENT => NIDENT, NDOCUMENT => NVL(REXSSERVICEFN.RN, NEXSSERVICEFN), NRN => NTMP);
/* Çàáèðàåì ñåðâèñ â âèäå êóðñîðà */ /* Çàáèðàåì ñåðâèñ â âèäå êóðñîðà */
SERVICEFN_GET(NIDENT => NIDENT, RCSERVICEFN => RCSERVICEFN); SERVICEFN_GET(NIDENT => NIDENT, RCSERVICEFN => RCSERVICEFN);
/* ×èñòèì áóôåð */ /* ×èñòèì áóôåð */
@ -1176,17 +1188,21 @@ create or replace package body PKG_EXS as
/* Ñ÷èòûâàíèå çàïèñè æóðíàëà ðàáîòû */ /* Ñ÷èòûâàíèå çàïèñè æóðíàëà ðàáîòû */
procedure LOG_GET procedure LOG_GET
( (
NFLAG_SMART in number, -- Ïðèçíàê âûäà÷è ñîîáùåíèÿ îá îøèáêå
NEXSLOG in number, -- Ðåã. íîìåð çàïèñè æóðíàëà NEXSLOG in number, -- Ðåã. íîìåð çàïèñè æóðíàëà
RCLOG out sys_refcursor -- Êóðñîð ñî ñïèñêîì çàïèñåé æóðíàëà ðàáîòû RCLOG out sys_refcursor -- Êóðñîð ñî ñïèñêîì çàïèñåé æóðíàëà ðàáîòû
) )
is is
REXSLOG EXSLOG%rowtype; -- Çàïèñü æóðíàëà ðàáîòû
NIDENT PKG_STD.TREF; -- Èäåíòèôèêàòîð áóôåðà NIDENT PKG_STD.TREF; -- Èäåíòèôèêàòîð áóôåðà
NTMP PKG_STD.TREF; -- Ðåã. íîìåð î÷åðåäíîé çàïèñè áóôåðà NTMP PKG_STD.TREF; -- Ðåã. íîìåð î÷åðåäíîé çàïèñè áóôåðà
begin begin
/* Ñ÷èòàåì çàïèñü æóðíàëà ðàáîòû */
REXSLOG := GET_EXSLOG_ID(NFLAG_SMART => NFLAG_SMART, NRN => NEXSLOG);
/* Ñôîðìèðóåì èäåíòèôèêàòîð áóôåðà */ /* Ñôîðìèðóåì èäåíòèôèêàòîð áóôåðà */
NIDENT := GEN_IDENT(); NIDENT := GEN_IDENT();
/* Ïîëîæèì ðåã. íîìåð çàïèñè æóðíàëà ðàáîòû â áóôåð */ /* Ïîëîæèì ðåã. íîìåð çàïèñè æóðíàëà ðàáîòû â áóôåð */
RNLIST_BASE_INSERT(NIDENT => NIDENT, NDOCUMENT => NEXSLOG, NRN => NTMP); RNLIST_BASE_INSERT(NIDENT => NIDENT, NDOCUMENT => NVL(REXSLOG.RN, NEXSLOG), NRN => NTMP);
/* Çàáèðàåì ïîçèöèþ î÷åðåäè â âèäå êóðñîðà */ /* Çàáèðàåì ïîçèöèþ î÷åðåäè â âèäå êóðñîðà */
LOG_GET(NIDENT => NIDENT, RCLOG => RCLOG); LOG_GET(NIDENT => NIDENT, RCLOG => RCLOG);
/* ×èñòèì áóôåð */ /* ×èñòèì áóôåð */
@ -1245,7 +1261,7 @@ create or replace package body PKG_EXS as
NEXSQUEUE => NEXSQUEUE, NEXSQUEUE => NEXSQUEUE,
NRN => NEXSLOG); NRN => NEXSLOG);
/* Âåðíåì äîáàâëåííóþ çàïèñü */ /* Âåðíåì äîáàâëåííóþ çàïèñü */
LOG_GET(NEXSLOG => NEXSLOG, RCLOG => RCLOG); LOG_GET(NFLAG_SMART => 0, NEXSLOG => NEXSLOG, RCLOG => RCLOG);
end LOG_PUT; end LOG_PUT;
/* Ñ÷èòûâàíèå ñîîáùåíèÿ èç î÷åðåäè */ /* Ñ÷èòûâàíèå ñîîáùåíèÿ èç î÷åðåäè */
@ -1303,17 +1319,21 @@ create or replace package body PKG_EXS as
/* Ñ÷èòûâàíèå ñîîáùåíèÿ èç î÷åðåäè */ /* Ñ÷èòûâàíèå ñîîáùåíèÿ èç î÷åðåäè */
procedure QUEUE_GET procedure QUEUE_GET
( (
NFLAG_SMART in number, -- Ïðèçíàê âûäà÷è ñîîáùåíèÿ îá îøèáêå
NEXSQUEUE in number, -- Ðåã. íîìåð çàïèñè î÷åðåäè NEXSQUEUE in number, -- Ðåã. íîìåð çàïèñè î÷åðåäè
RCQUEUE out sys_refcursor -- Êóðñîð ñ ïîçèöèåé î÷åðåäè RCQUEUE out sys_refcursor -- Êóðñîð ñ ïîçèöèåé î÷åðåäè
) )
is is
REXSQUEUE EXSQUEUE%rowtype; -- Çàïèñü ïîçèöèè î÷åðåäè
NIDENT PKG_STD.TREF; -- Èäåíòèôèêàòîð áóôåðà NIDENT PKG_STD.TREF; -- Èäåíòèôèêàòîð áóôåðà
NTMP PKG_STD.TREF; -- Ðåã. íîìåð î÷åðåäíîé çàïèñè áóôåðà NTMP PKG_STD.TREF; -- Ðåã. íîìåð î÷åðåäíîé çàïèñè áóôåðà
begin begin
/* Ñ÷èòàåì çàïèñü ïîçèöèè î÷åðåäè */
REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => NFLAG_SMART, NRN => NEXSQUEUE);
/* Ñôîðìèðóåì èäåíòèôèêàòîð áóôåðà */ /* Ñôîðìèðóåì èäåíòèôèêàòîð áóôåðà */
NIDENT := GEN_IDENT(); NIDENT := GEN_IDENT();
/* Ïîëîæèì ðåã. íîìåð çàïèñè î÷åðåäè â áóôåð */ /* Ïîëîæèì ðåã. íîìåð çàïèñè î÷åðåäè â áóôåð */
RNLIST_BASE_INSERT(NIDENT => NIDENT, NDOCUMENT => NEXSQUEUE, NRN => NTMP); RNLIST_BASE_INSERT(NIDENT => NIDENT, NDOCUMENT => NVL(REXSQUEUE.RN, NEXSQUEUE), NRN => NTMP);
/* Çàáèðàåì ïîçèöèþ î÷åðåäè â âèäå êóðñîðà */ /* Çàáèðàåì ïîçèöèþ î÷åðåäè â âèäå êóðñîðà */
QUEUE_GET(NIDENT => NIDENT, RCQUEUE => RCQUEUE); QUEUE_GET(NIDENT => NIDENT, RCQUEUE => RCQUEUE);
/* ×èñòèì áóôåð */ /* ×èñòèì áóôåð */
@ -1443,7 +1463,7 @@ create or replace package body PKG_EXS as
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NEXSQUEUE, SUNIT_TABLE => 'EXSQUEUE'); PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NEXSQUEUE, SUNIT_TABLE => 'EXSQUEUE');
end if; end if;
/* Âåðíåì èçìåíåííóþ ïîçèöèþ î÷åðåäè */ /* Âåðíåì èçìåíåííóþ ïîçèöèþ î÷åðåäè */
QUEUE_GET(NEXSQUEUE => NEXSQUEUE, RCQUEUE => RCQUEUE); QUEUE_GET(NFLAG_SMART => 0, NEXSQUEUE => NEXSQUEUE, RCQUEUE => RCQUEUE);
end QUEUE_EXEC_STATE_SET; end QUEUE_EXEC_STATE_SET;
/* Óñòàíîâêà ðåçóëüòàòà îáðàáîòêè çàïèñè î÷åðåäè */ /* Óñòàíîâêà ðåçóëüòàòà îáðàáîòêè çàïèñè î÷åðåäè */
@ -1457,8 +1477,11 @@ create or replace package body PKG_EXS as
begin begin
/* Âûñòàâèì ðåçóëüòàò */ /* Âûñòàâèì ðåçóëüòàò */
update EXSQUEUE T set T.RESP = BRESP where T.RN = NEXSQUEUE; update EXSQUEUE T set T.RESP = BRESP where T.RN = NEXSQUEUE;
if (sql%rowcount = 0) then
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NEXSQUEUE, SUNIT_TABLE => 'EXSQUEUE');
end if;
/* Âåðíåì èçìåíåííóþ ïîçèöèþ î÷åðåäè */ /* Âåðíåì èçìåíåííóþ ïîçèöèþ î÷åðåäè */
QUEUE_GET(NEXSQUEUE => NEXSQUEUE, RCQUEUE => RCQUEUE); QUEUE_GET(NFLAG_SMART => 0, NEXSQUEUE => NEXSQUEUE, RCQUEUE => RCQUEUE);
end QUEUE_RESP_SET; end QUEUE_RESP_SET;
/* Ïîìåùåíèå ñîîáùåíèÿ îáìåíà â î÷åðåäü */ /* Ïîìåùåíèå ñîîáùåíèÿ îáìåíà â î÷åðåäü */
@ -1489,7 +1512,7 @@ create or replace package body PKG_EXS as
NEXSQUEUE => NEXSQUEUE, NEXSQUEUE => NEXSQUEUE,
NRN => NRN); NRN => NRN);
/* Âîçâðàùàåì äîáàâëåííóþ ïîçèöèþ î÷åðåäè */ /* Âîçâðàùàåì äîáàâëåííóþ ïîçèöèþ î÷åðåäè */
QUEUE_GET(NEXSQUEUE => NRN, RCQUEUE => RCQUEUE); QUEUE_GET(NFLAG_SMART => 0, NEXSQUEUE => NRN, RCQUEUE => RCQUEUE);
end QUEUE_PUT; end QUEUE_PUT;
/* Ïîìåùåíèå ñîîáùåíèÿ îáìåíà â î÷åðåäü (ïî êîäó ñåðâèñà è ôóíêöèè îáðàáîêè) */ /* Ïîìåùåíèå ñîîáùåíèÿ îáìåíà â î÷åðåäü (ïî êîäó ñåðâèñà è ôóíêöèè îáðàáîêè) */
@ -1590,7 +1613,7 @@ create or replace package body PKG_EXS as
PKG_CONTPRMLOC.PURGE(RCONTAINER => PRMS); PKG_CONTPRMLOC.PURGE(RCONTAINER => PRMS);
end if; end if;
/* Âîçâðàùàåì îáðàáîòàííóþ ïîçèöèþ î÷åðåäè */ /* Âîçâðàùàåì îáðàáîòàííóþ ïîçèöèþ î÷åðåäè */
QUEUE_GET(NEXSQUEUE => REXSQUEUE.RN, RCQUEUE => RCQUEUE); QUEUE_GET(NFLAG_SMART => 0, NEXSQUEUE => REXSQUEUE.RN, RCQUEUE => RCQUEUE);
end QUEUE_PRC; end QUEUE_PRC;
end; end;