Чуть более умные алгоритмы поиска контрагента и договора (с фильтрацией вспомогательных слов и вычленением ключевых) + тестирование электронной инвентаризации

This commit is contained in:
Mikhail Chechnev 2018-12-17 00:25:52 +03:00
parent 419696523e
commit 6dcbc4732b

View File

@ -37,11 +37,131 @@ create or replace package UDO_PKG_EXS_TEST as
NSRV_TYPE in number, -- Òèï ñåðâèñà (ñì. êîíñòàíòû PKG_EXS.NSRV_TYPE*) NSRV_TYPE in number, -- Òèï ñåðâèñà (ñì. êîíñòàíòû PKG_EXS.NSRV_TYPE*)
NEXSQUEUE in number -- Ðåãèñòðàöèîííûé íîìåð îáðàáàòûâàåìîé ïîçèöèè î÷åðåäè îáìåíà NEXSQUEUE in number -- Ðåãèñòðàöèîííûé íîìåð îáðàáàòûâàåìîé ïîçèöèè î÷åðåäè îáìåíà
); );
/* Ýëåêòðîííàÿ èíâåíòàðèçàöèÿ - àóòåíòèôèêàöèÿ */
procedure INV_CHECKAUTH_XML
(
NIDENT in number, -- Èäåíòèôèêàòîð ïðîöåññà
NSRV_TYPE in number, -- Òèï ñåðâèñà (ñì. êîíñòàíòû PKG_EXS.NSRV_TYPE*)
NEXSQUEUE in number -- Ðåãèñòðàöèîííûé íîìåð îáðàáàòûâàåìîé ïîçèöèè î÷åðåäè îáìåíà
);
/* Ýëåêòðîííàÿ èíâåíòàðèçàöèÿ - ñ÷èòûâàíèå ïîëüçîâàòåëåé */
procedure INV_GETUSERS_XML
(
NIDENT in number, -- Èäåíòèôèêàòîð ïðîöåññà
NSRV_TYPE in number, -- Òèï ñåðâèñà (ñì. êîíñòàíòû PKG_EXS.NSRV_TYPE*)
NEXSQUEUE in number -- Ðåãèñòðàöèîííûé íîìåð îáðàáàòûâàåìîé ïîçèöèè î÷åðåäè îáìåíà
);
end; end;
/ /
create or replace package body UDO_PKG_EXS_TEST as create or replace package body UDO_PKG_EXS_TEST as
/* Òèï äàííûõ äëÿ êîëëåêöèè øàáëîíîâ âñïîìîãàòåëüíûõ ñëîâ ïîèñêà */
type THELPER_PATTERNS is table of varchar2(4000);
/* Ïðîâåðêà íà ïðèñóòñòâèå ñëîâà â ñïèñêå âñïîìîãàòåëüíûõ */
function UTL_HELPER_CHECK
(
SWORD in varchar2, -- Ïðîâåðÿåìîå ñëîâî
HELPER_PATTERNS in THELPER_PATTERNS -- Êîëëåêöèÿ øàáëîíîâ âñïîìîãàòåëüíûõ ñëîâ
)
return boolean -- Ðåçóëüàòà ïðîâåðêè
is
BRES boolean; -- Áóôåð äëÿ ðåçóëüòàòà
begin
/* Èíèöèàëèçèðóåì áóôåð */
BRES := false;
/* Åñëè êîëëåêöèÿ íå ïóñòà */
if ((HELPER_PATTERNS is not null) and (HELPER_PATTERNS.COUNT > 0)) then
/* Îáõîäèì å¸ */
for I in HELPER_PATTERNS.FIRST .. HELPER_PATTERNS.LAST
loop
/* Åñëè ñëîâî åñòü â êîëëåêöèè */
if (LOWER(SWORD) like LOWER(HELPER_PATTERNS(I))) then
/* Âûñòàâèì ôëàã ïðèñóòñòâèÿ è çàâåðøèì ïîèñê */
BRES := true;
exit;
end if;
end loop;
end if;
/* Âîçâðàùàåì îòâåò */
return BRES;
end UTL_HELPER_CHECK;
/* Èíèöèàëèçàöèÿ îáùèõ âñïîìîãàòåëüíûõ ïîèñêîâûõ ôðàç */
procedure UTL_HELPER_INIT_COMMON
(
HELPER_PATTERNS in out THELPER_PATTERNS -- Êîëëåêöèÿ øàáëîíîâ âñïîìîãàòåëüíûõ ñëîâ
)
is
begin
/* Ñîçäàäèì ïóñòóþ êîëëåêöèþ åñëè íàäî */
if (HELPER_PATTERNS is null) then
HELPER_PATTERNS := THELPER_PATTERNS();
end if;
/* Íàïîëíèì å¸ îáùèìè ïîèñêîâûìè âñïîìîãàòåëüíûìè ôðàçàìè */
HELPER_PATTERNS.EXTEND();
HELPER_PATTERNS(HELPER_PATTERNS.LAST) := 'ðàññêàæè';
HELPER_PATTERNS.EXTEND();
HELPER_PATTERNS(HELPER_PATTERNS.LAST) := 'ïðî';
HELPER_PATTERNS.EXTEND();
HELPER_PATTERNS(HELPER_PATTERNS.LAST) := 'î';
HELPER_PATTERNS.EXTEND();
HELPER_PATTERNS(HELPER_PATTERNS.LAST) := 'îá';
HELPER_PATTERNS.EXTEND();
HELPER_PATTERNS(HELPER_PATTERNS.LAST) := 'ïî';
HELPER_PATTERNS.EXTEND();
HELPER_PATTERNS(HELPER_PATTERNS.LAST) := 'ñâåäåíèÿ';
HELPER_PATTERNS.EXTEND();
HELPER_PATTERNS(HELPER_PATTERNS.LAST) := 'èíôîðìàöèþ';
HELPER_PATTERNS.EXTEND();
HELPER_PATTERNS(HELPER_PATTERNS.LAST) := 'èíôîðìàöèÿ';
HELPER_PATTERNS.EXTEND();
HELPER_PATTERNS(HELPER_PATTERNS.LAST) := 'èíôîðìàöèè';
HELPER_PATTERNS.EXTEND();
HELPER_PATTERNS(HELPER_PATTERNS.LAST) := 'èíôû';
HELPER_PATTERNS.EXTEND();
HELPER_PATTERNS(HELPER_PATTERNS.LAST) := 'èíôó';
HELPER_PATTERNS.EXTEND();
HELPER_PATTERNS(HELPER_PATTERNS.LAST) := 'äàé';
HELPER_PATTERNS.EXTEND();
HELPER_PATTERNS(HELPER_PATTERNS.LAST) := 'íàðîé';
HELPER_PATTERNS.EXTEND();
HELPER_PATTERNS(HELPER_PATTERNS.LAST) := 'çàïðîñè';
HELPER_PATTERNS.EXTEND();
HELPER_PATTERNS(HELPER_PATTERNS.LAST) := 'íàéäè';
end UTL_HELPER_INIT_COMMON;
/* Ïîäãîòîâêà ïîèñêîâîé ôðàçû ê ó÷àñòèþ â âûáîðêå */
function UTL_SEARCH_STR_PREPARE
(
SSEARCH_STR in varchar2, -- Ïîèñêîâàÿ ôðàçà
SDELIM in varchar2, -- Ðàçäåëèòåëü ñëîâ â ïîèñêîâîé ôðàçå
HELPER_PATTERNS in THELPER_PATTERNS -- Êîëëåêöèÿ øàáëîíîâ âñïîìîãàòåëüíûõ ñëîâ
)
return varchar2 -- Ïîäãîòîâëåííàÿ ïîèñêîâàÿ ôðàçà
is
SRES varchar2(32000); -- Ðåçóëüòàò ðàáîòû
begin
/* Îáõîäèì ñëîâà ïîèñêîâîé ôðàçû */
for W in (select REGEXP_SUBSTR(T.STR, '[^' || SDELIM || ']+', 1, level) SWRD
from (select replace(replace(SSEARCH_STR, ',', ''), '.', '') STR from DUAL) T
connect by INSTR(T.STR, SDELIM, 1, level - 1) > 0)
loop
/* Åñëè ñëîâî íå â ñïèñêå âñïîìîãàòåëüíûõ */
if (not UTL_HELPER_CHECK(SWORD => W.SWRD, HELPER_PATTERNS => HELPER_PATTERNS)) then
/* Îñòàâëÿåì åãî â èòîãîâîé âûáîðêå */
SRES := SRES || '%' || W.SWRD;
end if;
end loop;
/* Óáåðåì ëèøíèå ïðîáåëû è ãîòîâèì äëÿ ïîèñêà */
SRES := '%' || trim(SRES) || '%';
/* Âåðíåì îòâåò */
return SRES;
end UTL_SEARCH_STR_PREPARE;
/* Çàïðîñèòü êîíòðàãåíòà */ /* Çàïðîñèòü êîíòðàãåíòà */
procedure RECIVE_AGENT procedure RECIVE_AGENT
( (
@ -188,58 +308,66 @@ create or replace package body UDO_PKG_EXS_TEST as
NEXSQUEUE in number -- Ðåãèñòðàöèîííûé íîìåð îáðàáàòûâàåìîé ïîçèöèè î÷åðåäè îáìåíà NEXSQUEUE in number -- Ðåãèñòðàöèîííûé íîìåð îáðàáàòûâàåìîé ïîçèöèè î÷åðåäè îáìåíà
) )
is is
HELPER_PATTERNS THELPER_PATTERNS; -- Êîëëåêöèÿ øàáëîíîâ âñïîìîãàòåëüíûõ ñëîâ ïîèñêà
REXSQUEUE EXSQUEUE%rowtype; -- Çàïèñü ïîçèöèè î÷åðåäè REXSQUEUE EXSQUEUE%rowtype; -- Çàïèñü ïîçèöèè î÷åðåäè
CTMP clob; -- Áóôåð äëÿ êîíâåðòàöèè CTMP clob; -- Áóôåð äëÿ êîíâåðòàöèè
CRESP clob; -- Äàííûå äëÿ îòâåòà CRESP clob; -- Äàííûå äëÿ îòâåòà
RCTMP sys_refcursor; -- Áóôåð äëÿ èçìåíåííîé ïîçèöèè î÷åðåäè RCTMP sys_refcursor; -- Áóôåð äëÿ èçìåíåííîé ïîçèöèè î÷åðåäè
begin begin
/* Ñ÷èòàåì çàïèñü î÷åðåäè */ /* Ñ÷èòàåì çàïèñü î÷åðåäè */
REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE); REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE);
/* Çàáèðàåì äàííûå ñîîáùåíèÿ è êîíâåðòèðóåì â êîäèðîâêó ÁÄ */ /* Èíèöèàëèçèðóåì êîëëåêöèþ ñëîâ-ïîìîøíèêîâ */
CTMP := BLOB2CLOB(LBDATA => REXSQUEUE.MSG, SCHARSET => 'UTF8'); UTL_HELPER_INIT_COMMON(HELPER_PATTERNS => HELPER_PATTERNS);
/* Êëàä¸ì êîíâåðòèðîâàííîå îáðàòíî (ïðîñòî äëÿ óäîáñòâà ìîíèòîðèíãà) */ /* Íàïîëíÿåì å¸ çíà÷åíèÿìè èíäèâèäóàëüíûìè äëÿ äàííîãî çàïðîñà */
PKG_EXS.QUEUE_MSG_SET(NEXSQUEUE => REXSQUEUE.RN, BMSG => CLOB2BLOB(LCDATA => CTMP), RCQUEUE => RCTMP); HELPER_PATTERNS.EXTEND();
/* Åñëè åñòü ÷òî èñêàòü */ HELPER_PATTERNS(HELPER_PATTERNS.LAST) := 'êîíòðàãåíò%';
if (CTMP is not null) then /* Çàáèðàåì äàííûå ñîîáùåíèÿ è êîíâåðòèðóåì â êîäèðîâêó ÁÄ */
/* Èíèöèàëèçèðóåì îòâåò */ CTMP := BLOB2CLOB(LBDATA => REXSQUEUE.MSG, SCHARSET => 'UTF8');
CRESP := 'Êîíòðàãåíò "' || CTMP || '" íå íàéäåí'; /* Êëàä¸ì êîíâåðòèðîâàííîå îáðàòíî (ïðîñòî äëÿ óäîáñòâà ìîíèòîðèíãà) */
/* Èùåì çàïðîøåííîãî êîíòðàãåíòà */ PKG_EXS.QUEUE_MSG_SET(NEXSQUEUE => REXSQUEUE.RN, BMSG => CLOB2BLOB(LCDATA => CTMP), RCQUEUE => RCTMP);
for C in (select T.AGNNAME || /* Åñëè åñòü ÷òî èñêàòü */
DECODE(T.AGNTYPE, 1, ', ôèçè÷åñêîå ëèöî', ', þðèäè÷åñêîå ëèöî') SAGENT, if (CTMP is not null) then
(select count(CN.RN) from CONTRACTS CN where CN.AGENT = T.RN) NCNT_CONTRACTS, /* Ïîäãîòîâèì ïîèñêîâóþ ôðàçó */
(select sum(CN.DOC_SUM) from CONTRACTS CN where CN.AGENT = T.RN) NSUM_CONTRACTS CTMP := UTL_SEARCH_STR_PREPARE(SSEARCH_STR => CTMP, SDELIM => ' ', HELPER_PATTERNS => HELPER_PATTERNS);
from AGNLIST T /* Èíèöèàëèçèðóåì îòâåò */
where ((STRINLIKE(LOWER(T.AGNABBR), '%' || LOWER(replace(CTMP, ' ', '% %')) || '%', ' ') <> 0) or CRESP := 'Êîíòðàãåíò íå íàéäåí';
(STRINLIKE(LOWER(T.AGNNAME), '%' || LOWER(replace(CTMP, ' ', '% %')) || '%', ' ') <> 0)) /* Èùåì çàïðîøåííîãî êîíòðàãåíòà */
and ROWNUM <= 1) for C in (select T.AGNNAME ||
loop DECODE(T.AGNTYPE, 1, ', ôèçè÷åñêîå ëèöî', ', þðèäè÷åñêîå ëèöî') SAGENT,
CRESP := C.SAGENT; (select count(CN.RN) from CONTRACTS CN where CN.AGENT = T.RN) NCNT_CONTRACTS,
if (C.NCNT_CONTRACTS = 0) then (select sum(CN.DOC_SUM) from CONTRACTS CN where CN.AGENT = T.RN) NSUM_CONTRACTS
CRESP := CRESP || ', íå èìååò çàðåãèñòðèðîâàííûõ â ñèñòåìå äîãîâîðîâ'; from AGNLIST T
else where ((LOWER(T.AGNABBR) like LOWER(CTMP)) or (LOWER(T.AGNNAME) like LOWER(CTMP)))
CRESP := CRESP || ', çàðåãèñòðèðîâàíî äîãîâîðîâ: ' || TO_CHAR(C.NCNT_CONTRACTS); and ROWNUM <= 1)
if (C.NSUM_CONTRACTS <> 0) then loop
CRESP := CRESP || ', íà îáùóþ ñóììó: ' || TO_CHAR(C.NSUM_CONTRACTS) || ' ðóá.'; CRESP := C.SAGENT;
end if; if (C.NCNT_CONTRACTS = 0) then
end if; CRESP := CRESP || ', íå èìååò çàðåãèñòðèðîâàííûõ â ñèñòåìå äîãîâîðîâ';
end loop; else
else CRESP := CRESP || ', çàðåãèñòðèðîâàíî äîãîâîðîâ: ' || TO_CHAR(C.NCNT_CONTRACTS);
CRESP := 'Íå óêàçàí ïîèñêîâûé çàïðîñ'; if (C.NSUM_CONTRACTS <> 0) then
end if; CRESP := CRESP || ', íà îáùóþ ñóììó: ' || TO_CHAR(C.NSUM_CONTRACTS) || ' ðóá.';
/* Âîçâðàùàåì îòâåò */ end if;
PKG_EXS.PRC_RESP_ARG_BLOB_SET(NIDENT => NIDENT, end if;
SARG => PKG_EXS.SCONT_FLD_BRESP, end loop;
BVALUE => CLOB2BLOB(LCDATA => CRESP, SCHARSET => 'UTF8')); else
end RESP_FIND_AGENT; CRESP := 'Íå óêàçàí ïîèñêîâûé çàïðîñ';
end if;
/* Âîçâðàùàåì îòâåò */
PKG_EXS.PRC_RESP_ARG_BLOB_SET(NIDENT => NIDENT,
SARG => PKG_EXS.SCONT_FLD_BRESP,
BVALUE => CLOB2BLOB(LCDATA => CRESP, SCHARSET => 'UTF8'));
end RESP_FIND_AGENT;
/* Îáðàáîòêà çàïðîñà íà ïîèñê äîãîâîðà */ /* Îáðàáîòêà çàïðîñà íà ïîèñê äîãîâîðà */
procedure RESP_FIND_CONTRACT procedure RESP_FIND_CONTRACT
( (
NIDENT in number, -- Èäåíòèôèêàòîð ïðîöåññà NIDENT in number, -- Èäåíòèôèêàòîð ïðîöåññà
NSRV_TYPE in number, -- Òèï ñåðâèñà (ñì. êîíñòàíòû PKG_EXS.NSRV_TYPE*) NSRV_TYPE in number, -- Òèï ñåðâèñà (ñì. êîíñòàíòû PKG_EXS.NSRV_TYPE*)
NEXSQUEUE in number -- Ðåãèñòðàöèîííûé íîìåð îáðàáàòûâàåìîé ïîçèöèè î÷åðåäè îáìåíà NEXSQUEUE in number -- Ðåãèñòðàöèîííûé íîìåð îáðàáàòûâàåìîé ïîçèöèè î÷åðåäè îáìåíà
) )
is is
HELPER_PATTERNS THELPER_PATTERNS; -- Êîëëåêöèÿ øàáëîíîâ âñïîìîãàòåëüíûõ ñëîâ ïîèñêà
REXSQUEUE EXSQUEUE%rowtype; -- Çàïèñü ïîçèöèè î÷åðåäè REXSQUEUE EXSQUEUE%rowtype; -- Çàïèñü ïîçèöèè î÷åðåäè
CTMP clob; -- Áóôåð äëÿ êîíâåðòàöèè CTMP clob; -- Áóôåð äëÿ êîíâåðòàöèè
CRESP clob; -- Äàííûå äëÿ îòâåòà CRESP clob; -- Äàííûå äëÿ îòâåòà
@ -247,12 +375,19 @@ create or replace package body UDO_PKG_EXS_TEST as
begin begin
/* Ñ÷èòàåì çàïèñü î÷åðåäè */ /* Ñ÷èòàåì çàïèñü î÷åðåäè */
REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE); REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE);
/* Èíèöèàëèçèðóåì êîëëåêöèþ ñëîâ-ïîìîøíèêîâ */
UTL_HELPER_INIT_COMMON(HELPER_PATTERNS => HELPER_PATTERNS);
/* Íàïîëíÿåì å¸ çíà÷åíèÿìè èíäèâèäóàëüíûìè äëÿ äàííîãî çàïðîñà */
HELPER_PATTERNS.EXTEND();
HELPER_PATTERNS(HELPER_PATTERNS.LAST) := 'äîãîâîð%';
/* Çàáèðàåì äàííûå ñîîáùåíèÿ è êîíâåðòèðóåì â êîäèðîâêó ÁÄ */ /* Çàáèðàåì äàííûå ñîîáùåíèÿ è êîíâåðòèðóåì â êîäèðîâêó ÁÄ */
CTMP := BLOB2CLOB(LBDATA => REXSQUEUE.MSG, SCHARSET => 'UTF8'); CTMP := BLOB2CLOB(LBDATA => REXSQUEUE.MSG, SCHARSET => 'UTF8');
/* Êëàä¸ì êîíâåðòèðîâàííîå îáðàòíî (ïðîñòî äëÿ óäîáñòâà ìîíèòîðèíãà) */ /* Êëàä¸ì êîíâåðòèðîâàííîå îáðàòíî (ïðîñòî äëÿ óäîáñòâà ìîíèòîðèíãà) */
PKG_EXS.QUEUE_MSG_SET(NEXSQUEUE => REXSQUEUE.RN, BMSG => CLOB2BLOB(LCDATA => CTMP), RCQUEUE => RCTMP); PKG_EXS.QUEUE_MSG_SET(NEXSQUEUE => REXSQUEUE.RN, BMSG => CLOB2BLOB(LCDATA => CTMP), RCQUEUE => RCTMP);
/* Åñëè åñòü ÷òî èñêàòü */ /* Åñëè åñòü ÷òî èñêàòü */
if (CTMP is not null) then if (CTMP is not null) then
/* Ïîäãîòîâèì ïîèñêîâóþ ôðàçó */
CTMP := UTL_SEARCH_STR_PREPARE(SSEARCH_STR => CTMP, SDELIM => ' ', HELPER_PATTERNS => HELPER_PATTERNS);
/* Èùåì çàïðîøåííûé äîãîâîð */ /* Èùåì çàïðîøåííûé äîãîâîð */
begin begin
select DECODE(T.INOUT_SIGN, 0, 'Âõîäÿùèé', 'Èñõîäÿùèé') || ' äîãîâîð ¹' || select DECODE(T.INOUT_SIGN, 0, 'Âõîäÿùèé', 'Èñõîäÿùèé') || ' äîãîâîð ¹' ||
@ -264,16 +399,14 @@ create or replace package body UDO_PKG_EXS_TEST as
from CONTRACTS T, from CONTRACTS T,
AGNLIST AG, AGNLIST AG,
CURNAMES CN CURNAMES CN
where ((STRINLIKE(LOWER(T.EXT_NUMBER), '%' || LOWER(replace(CTMP, ' ', '% %')) || '%', ' ') <> 0) or where ((LOWER(T.EXT_NUMBER) like LOWER(CTMP)) or
(STRINLIKE(LOWER(trim(T.DOC_PREF) || trim(T.DOC_NUMB)), (LOWER(trim(T.DOC_PREF) || trim(T.DOC_NUMB)) like LOWER(CTMP)))
'%' || LOWER(replace(CTMP, ' ', '% %')) || '%',
' ') <> 0))
and T.AGENT = AG.RN and T.AGENT = AG.RN
and T.CURRENCY = CN.RN and T.CURRENCY = CN.RN
and ROWNUM <= 1; and ROWNUM <= 1;
exception exception
when NO_DATA_FOUND then when NO_DATA_FOUND then
CRESP := 'Äîãîâîð "' || CTMP || '" íå íàéäåí'; CRESP := 'Äîãîâîð íå íàéäåí';
end; end;
else else
CRESP := 'Íå óêàçàí ïîèñêîâûé çàïðîñ'; CRESP := 'Íå óêàçàí ïîèñêîâûé çàïðîñ';
@ -283,6 +416,354 @@ create or replace package body UDO_PKG_EXS_TEST as
SARG => PKG_EXS.SCONT_FLD_BRESP, SARG => PKG_EXS.SCONT_FLD_BRESP,
BVALUE => CLOB2BLOB(LCDATA => CRESP, SCHARSET => 'UTF8')); BVALUE => CLOB2BLOB(LCDATA => CRESP, SCHARSET => 'UTF8'));
end RESP_FIND_CONTRACT; end RESP_FIND_CONTRACT;
/* Ýëåêòðîííàÿ èíâåíòàðèçàöèÿ - àóòåíòèôèêàöèÿ */
procedure INV_CHECKAUTH_XML
(
NIDENT in number, -- Èäåíòèôèêàòîð ïðîöåññà
NSRV_TYPE in number, -- Òèï ñåðâèñà (ñì. êîíñòàíòû PKG_EXS.NSRV_TYPE*)
NEXSQUEUE in number -- Ðåãèñòðàöèîííûé íîìåð îáðàáàòûâàåìîé ïîçèöèè î÷åðåäè îáìåíà
)
is
REXSQUEUE EXSQUEUE%rowtype; -- Çàïèñü ïîçèöèè î÷åðåäè
/**/
SREQDEVICEID varchar2(30);
XCHECKAUTHRESPONSE DBMS_XMLDOM.DOMNODE;
XRESULT DBMS_XMLDOM.DOMNODE;
XNODE DBMS_XMLDOM.DOMNODE;
CRESPONSE clob;
XDOC DBMS_XMLDOM.DOMDOCUMENT;
/**/
XMLPARCER DBMS_XMLPARSER.PARSER;
XENVELOPE DBMS_XMLDOM.DOMNODE;
XBODY DBMS_XMLDOM.DOMNODE;
XNODELIST DBMS_XMLDOM.DOMNODELIST;
XNODE_ROOT DBMS_XMLDOM.DOMNODE;
SNODE varchar2(100);
CREQ clob;
/**/
STSD constant varchar2(20) := 'tsd';
SCHECKAUTHRESPONSE constant varchar2(20) := 'CheckAuthResponse';
SDEVICEID constant varchar2(20) := 'DeviceID';
SRESULT constant varchar2(20) := 'Result';
SSOAPENV constant varchar2(20) := 'soapenv';
SENVELOPE constant varchar2(20) := 'Envelope';
SHEADER constant varchar2(20) := 'Header';
SBODY constant varchar2(20) := 'Body';
/* Ñîçäàíèå âåòêè XML */
function CREATENODE
(
STAG in varchar2,
SNS in varchar2 default null,
SVAL in varchar2 default null
) return DBMS_XMLDOM.DOMNODE is
XEL DBMS_XMLDOM.DOMELEMENT;
XNODE DBMS_XMLDOM.DOMNODE;
XTEXT DBMS_XMLDOM.DOMNODE;
begin
if SNS is not null then
XEL := DBMS_XMLDOM.CREATEELEMENT(DOC => XDOC, TAGNAME => STAG, NS => SNS);
XNODE := DBMS_XMLDOM.MAKENODE(XEL);
DBMS_XMLDOM.SETPREFIX(N => XNODE, PREFIX => SNS);
else
XEL := DBMS_XMLDOM.CREATEELEMENT(DOC => XDOC, TAGNAME => STAG);
XNODE := DBMS_XMLDOM.MAKENODE(XEL);
end if;
if SVAL is not null then
XTEXT := DBMS_XMLDOM.APPENDCHILD(XNODE, DBMS_XMLDOM.MAKENODE(DBMS_XMLDOM.CREATETEXTNODE(XDOC, SVAL)));
end if;
return XNODE;
end;
/* Ñ÷èòûâàíèå çíà÷åíèÿ âåòêè XML */
function GETNODEVAL
(
XROOTNODE in DBMS_XMLDOM.DOMNODE,
SPATTERN in varchar2
) return varchar2 is
XNODE DBMS_XMLDOM.DOMNODE;
SVAL varchar2(100);
begin
XNODE := DBMS_XSLPROCESSOR.SELECTSINGLENODE(N => XROOTNODE, PATTERN => SPATTERN);
if DBMS_XMLDOM.ISNULL(XNODE) then
return null;
end if;
SVAL := DBMS_XMLDOM.GETNODEVALUE(DBMS_XMLDOM.GETFIRSTCHILD(N => XNODE));
return SVAL;
end GETNODEVAL;
/* Ñîçäàíèå äîêóìåíòà äëÿ îòâåòà */
procedure CREATERESPONSEDOC is
begin
XDOC := DBMS_XMLDOM.NEWDOMDOCUMENT;
DBMS_XMLDOM.SETVERSION(XDOC
,'1.0" encoding="UTF-8');
DBMS_XMLDOM.SETCHARSET(XDOC
,'UTF-8');
end;
/* Ñîçäàíèå îòâåòà */
function CREATERESPONSE(XCONTENT in DBMS_XMLDOM.DOMNODE) return clob is
XMAIN_NODE DBMS_XMLDOM.DOMNODE;
XENVELOPE_EL DBMS_XMLDOM.DOMELEMENT;
XENVELOPE DBMS_XMLDOM.DOMNODE;
XHEADER DBMS_XMLDOM.DOMNODE;
XBODY DBMS_XMLDOM.DOMNODE;
XNODE DBMS_XMLDOM.DOMNODE;
CDATA clob;
begin
-- Document
XMAIN_NODE := DBMS_XMLDOM.MAKENODE(XDOC);
-- Envelope
XENVELOPE_EL := DBMS_XMLDOM.CREATEELEMENT(DOC => XDOC, TAGNAME => SENVELOPE, NS => SSOAPENV);
DBMS_XMLDOM.SETATTRIBUTE(ELEM => XENVELOPE_EL,
name => 'xmlns:soapenv',
NEWVALUE => 'http://schemas.xmlsoap.org/soap/envelope/');
DBMS_XMLDOM.SETATTRIBUTE(ELEM => XENVELOPE_EL, name => 'xmlns:tsd', NEWVALUE => 'http://www.example.org/TSDService/');
XENVELOPE := DBMS_XMLDOM.MAKENODE(XENVELOPE_EL);
DBMS_XMLDOM.SETPREFIX(N => XENVELOPE, PREFIX => SSOAPENV);
XENVELOPE := DBMS_XMLDOM.APPENDCHILD(N => XMAIN_NODE, NEWCHILD => XENVELOPE);
-- Header
XHEADER := CREATENODE(SHEADER, SSOAPENV);
XHEADER := DBMS_XMLDOM.APPENDCHILD(N => XENVELOPE, NEWCHILD => XHEADER);
-- Body
XBODY := CREATENODE(SBODY, SSOAPENV);
XBODY := DBMS_XMLDOM.APPENDCHILD(N => XENVELOPE, NEWCHILD => XBODY);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XBODY, NEWCHILD => XCONTENT);
-- Ñîçäàåì CLOB
DBMS_LOB.CREATETEMPORARY(LOB_LOC => CDATA, CACHE => true, DUR => DBMS_LOB.SESSION);
DBMS_XMLDOM.WRITETOCLOB(XDOC, CDATA, 'UTF-8');
DBMS_XMLDOM.FREEDOCUMENT(DOC => XDOC);
return CDATA;
end;
begin
/* Ñ÷èòàåì çàïèñü î÷åðåäè */
REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE);
/* Êîíâåðòèðóåì â êîäèðîâêó ÁÄ */
CREQ := BLOB2CLOB(LBDATA => REXSQUEUE.MSG);
-- Ñîçäàåì èíñòàíñ XML ïàðñåðà
XMLPARCER := DBMS_XMLPARSER.NEWPARSER;
-- Ñ÷èòûâàåì XML èç çàïðîñà
DBMS_XMLPARSER.PARSECLOB(XMLPARCER
,CREQ);
-- Áåðåì XML äîêóìåíò
XDOC := DBMS_XMLPARSER.GETDOCUMENT(XMLPARCER);
-- Ñ÷èòûâàåì Êîðíåâîé ýëåìåíò
XENVELOPE := DBMS_XMLDOM.MAKENODE(DBMS_XMLDOM.GETDOCUMENTELEMENT(XDOC));
-- Ñ÷èòûâàåì ýëåìåíò Body
XBODY := DBMS_XSLPROCESSOR.SELECTSINGLENODE(XENVELOPE
,SBODY);
-- Ñ÷èòûâàåì äî÷åðíèå ýëåìåíòû ê Body
XNODELIST := DBMS_XMLDOM.GETCHILDNODES(XBODY);
-- Áåðåì ïåðâûé äî÷åðíèé ýëåìåíò
XNODE_ROOT := DBMS_XMLDOM.ITEM(XNODELIST
,0);
-- Ñ÷èòàåì èìÿ ýëåìåíòà
DBMS_XMLDOM.GETLOCALNAME(XNODE_ROOT
,SNODE);
-- Ñ÷èòûâàåì DeviceID
SREQDEVICEID := GETNODEVAL(XNODE_ROOT
,SDEVICEID);
--CHECK_ID(SREQDEVICEID);
CREATERESPONSEDOC();
if SREQDEVICEID is not null
then
XCHECKAUTHRESPONSE := CREATENODE(SCHECKAUTHRESPONSE
,STSD);
XRESULT := CREATENODE(SRESULT
,STSD
,'true');
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XCHECKAUTHRESPONSE
,NEWCHILD => XRESULT);
CRESPONSE := CREATERESPONSE(XCHECKAUTHRESPONSE);
end if;
/* Âîçâðàùàåì îòâåò */
PKG_EXS.PRC_RESP_ARG_BLOB_SET(NIDENT => NIDENT,
SARG => PKG_EXS.SCONT_FLD_BRESP,
BVALUE => CLOB2BLOB(LCDATA => CRESPONSE));
end;
/* Ýëåêòðîííàÿ èíâåíòàðèçàöèÿ - ñ÷èòûâàíèå ïîëüçîâàòåëåé */
procedure INV_GETUSERS_XML
(
NIDENT in number, -- Èäåíòèôèêàòîð ïðîöåññà
NSRV_TYPE in number, -- Òèï ñåðâèñà (ñì. êîíñòàíòû PKG_EXS.NSRV_TYPE*)
NEXSQUEUE in number -- Ðåãèñòðàöèîííûé íîìåð îáðàáàòûâàåìîé ïîçèöèè î÷åðåäè îáìåíà
)
is
REXSQUEUE EXSQUEUE%rowtype; -- Çàïèñü ïîçèöèè î÷åðåäè
/**/
SREQDEVICEID varchar2(30);
XGETUSERSRESPONSE DBMS_XMLDOM.DOMNODE;
XITEM DBMS_XMLDOM.DOMNODE;
XCODE DBMS_XMLDOM.DOMNODE;
XNAME DBMS_XMLDOM.DOMNODE;
XNODE DBMS_XMLDOM.DOMNODE;
CRESPONSE clob;
XDOC DBMS_XMLDOM.DOMDOCUMENT;
/**/
XMLPARCER DBMS_XMLPARSER.PARSER;
XENVELOPE DBMS_XMLDOM.DOMNODE;
XBODY DBMS_XMLDOM.DOMNODE;
XNODELIST DBMS_XMLDOM.DOMNODELIST;
XNODE_ROOT DBMS_XMLDOM.DOMNODE;
SNODE varchar2(100);
CREQ clob;
/**/
STSD constant varchar2(20) := 'tsd';
SGETUSERSRESPONSE constant varchar2(20) := 'GetUsersResponse';
SDEVICEID constant varchar2(20) := 'DeviceID';
SRESULT constant varchar2(20) := 'Result';
SSOAPENV constant varchar2(20) := 'soapenv';
SENVELOPE constant varchar2(20) := 'Envelope';
SHEADER constant varchar2(20) := 'Header';
SBODY constant varchar2(20) := 'Body';
SITEM constant varchar2(20) := 'Item';
SCODE constant varchar2(20) := 'Code';
SNAME constant varchar2(20) := 'Name';
/* Ñîçäàíèå âåòêè XML */
function CREATENODE
(
STAG in varchar2,
SNS in varchar2 default null,
SVAL in varchar2 default null
) return DBMS_XMLDOM.DOMNODE is
XEL DBMS_XMLDOM.DOMELEMENT;
XNODE DBMS_XMLDOM.DOMNODE;
XTEXT DBMS_XMLDOM.DOMNODE;
begin
if SNS is not null then
XEL := DBMS_XMLDOM.CREATEELEMENT(DOC => XDOC, TAGNAME => STAG, NS => SNS);
XNODE := DBMS_XMLDOM.MAKENODE(XEL);
DBMS_XMLDOM.SETPREFIX(N => XNODE, PREFIX => SNS);
else
XEL := DBMS_XMLDOM.CREATEELEMENT(DOC => XDOC, TAGNAME => STAG);
XNODE := DBMS_XMLDOM.MAKENODE(XEL);
end if;
if SVAL is not null then
XTEXT := DBMS_XMLDOM.APPENDCHILD(XNODE, DBMS_XMLDOM.MAKENODE(DBMS_XMLDOM.CREATETEXTNODE(XDOC, SVAL)));
end if;
return XNODE;
end;
/* Ñ÷èòûâàíèå çíà÷åíèÿ âåòêè XML */
function GETNODEVAL
(
XROOTNODE in DBMS_XMLDOM.DOMNODE,
SPATTERN in varchar2
) return varchar2 is
XNODE DBMS_XMLDOM.DOMNODE;
SVAL varchar2(100);
begin
XNODE := DBMS_XSLPROCESSOR.SELECTSINGLENODE(N => XROOTNODE, PATTERN => SPATTERN);
if DBMS_XMLDOM.ISNULL(XNODE) then
return null;
end if;
SVAL := DBMS_XMLDOM.GETNODEVALUE(DBMS_XMLDOM.GETFIRSTCHILD(N => XNODE));
return SVAL;
end GETNODEVAL;
/* Ñîçäàíèå äîêóìåíòà äëÿ îòâåòà */
procedure CREATERESPONSEDOC is
begin
XDOC := DBMS_XMLDOM.NEWDOMDOCUMENT;
DBMS_XMLDOM.SETVERSION(XDOC
,'1.0" encoding="UTF-8');
DBMS_XMLDOM.SETCHARSET(XDOC
,'UTF-8');
end;
/* Ñîçäàíèå îòâåòà */
function CREATERESPONSE(XCONTENT in DBMS_XMLDOM.DOMNODE) return clob is
XMAIN_NODE DBMS_XMLDOM.DOMNODE;
XENVELOPE_EL DBMS_XMLDOM.DOMELEMENT;
XENVELOPE DBMS_XMLDOM.DOMNODE;
XHEADER DBMS_XMLDOM.DOMNODE;
XBODY DBMS_XMLDOM.DOMNODE;
XNODE DBMS_XMLDOM.DOMNODE;
CDATA clob;
begin
-- Document
XMAIN_NODE := DBMS_XMLDOM.MAKENODE(XDOC);
-- Envelope
XENVELOPE_EL := DBMS_XMLDOM.CREATEELEMENT(DOC => XDOC, TAGNAME => SENVELOPE, NS => SSOAPENV);
DBMS_XMLDOM.SETATTRIBUTE(ELEM => XENVELOPE_EL,
name => 'xmlns:soapenv',
NEWVALUE => 'http://schemas.xmlsoap.org/soap/envelope/');
DBMS_XMLDOM.SETATTRIBUTE(ELEM => XENVELOPE_EL, name => 'xmlns:tsd', NEWVALUE => 'http://www.example.org/TSDService/');
XENVELOPE := DBMS_XMLDOM.MAKENODE(XENVELOPE_EL);
DBMS_XMLDOM.SETPREFIX(N => XENVELOPE, PREFIX => SSOAPENV);
XENVELOPE := DBMS_XMLDOM.APPENDCHILD(N => XMAIN_NODE, NEWCHILD => XENVELOPE);
-- Header
XHEADER := CREATENODE(SHEADER, SSOAPENV);
XHEADER := DBMS_XMLDOM.APPENDCHILD(N => XENVELOPE, NEWCHILD => XHEADER);
-- Body
XBODY := CREATENODE(SBODY, SSOAPENV);
XBODY := DBMS_XMLDOM.APPENDCHILD(N => XENVELOPE, NEWCHILD => XBODY);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XBODY, NEWCHILD => XCONTENT);
-- Ñîçäàåì CLOB
DBMS_LOB.CREATETEMPORARY(LOB_LOC => CDATA, CACHE => true, DUR => DBMS_LOB.SESSION);
DBMS_XMLDOM.WRITETOCLOB(XDOC, CDATA, 'UTF-8');
DBMS_XMLDOM.FREEDOCUMENT(DOC => XDOC);
return CDATA;
end;
begin
/* Ñ÷èòàåì çàïèñü î÷åðåäè */
REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE);
/* Êîíâåðòèðóåì â êîäèðîâêó ÁÄ */
CREQ := BLOB2CLOB(LBDATA => REXSQUEUE.MSG);
-- Ñîçäàåì èíñòàíñ XML ïàðñåðà
XMLPARCER := DBMS_XMLPARSER.NEWPARSER;
-- Ñ÷èòûâàåì XML èç çàïðîñà
DBMS_XMLPARSER.PARSECLOB(XMLPARCER
,CREQ);
-- Áåðåì XML äîêóìåíò
XDOC := DBMS_XMLPARSER.GETDOCUMENT(XMLPARCER);
-- Ñ÷èòûâàåì Êîðíåâîé ýëåìåíò
XENVELOPE := DBMS_XMLDOM.MAKENODE(DBMS_XMLDOM.GETDOCUMENTELEMENT(XDOC));
-- Ñ÷èòûâàåì ýëåìåíò Body
XBODY := DBMS_XSLPROCESSOR.SELECTSINGLENODE(XENVELOPE
,SBODY);
-- Ñ÷èòûâàåì äî÷åðíèå ýëåìåíòû ê Body
XNODELIST := DBMS_XMLDOM.GETCHILDNODES(XBODY);
-- Áåðåì ïåðâûé äî÷åðíèé ýëåìåíò
XNODE_ROOT := DBMS_XMLDOM.ITEM(XNODELIST
,0);
-- Ñ÷èòàåì èìÿ ýëåìåíòà
DBMS_XMLDOM.GETLOCALNAME(XNODE_ROOT
,SNODE);
-- Ñ÷èòûâàåì DeviceID
SREQDEVICEID := GETNODEVAL(XNODE_ROOT
,SDEVICEID);
--CHECK_ID(SREQDEVICEID);
CREATERESPONSEDOC();
if SREQDEVICEID is not null
then
XGETUSERSRESPONSE := CREATENODE(SGETUSERSRESPONSE
,STSD);
for REC in (select T.RN
,A.AGNABBR
from INVPERSONS T
,AGNLIST A
where T.COMPANY = 136018
and T.AGNLIST = A.RN)
loop
XITEM := CREATENODE(SITEM
,STSD);
XCODE := CREATENODE(SCODE
,STSD
,REC.RN);
XNAME := CREATENODE(SNAME
,STSD
,REC.AGNABBR);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM
,NEWCHILD => XCODE);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM
,NEWCHILD => XNAME);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XGETUSERSRESPONSE
,NEWCHILD => XITEM);
end loop;
CRESPONSE := CREATERESPONSE(XGETUSERSRESPONSE);
end if;
/* Âîçâðàùàåì îòâåò */
PKG_EXS.PRC_RESP_ARG_BLOB_SET(NIDENT => NIDENT,
SARG => PKG_EXS.SCONT_FLD_BRESP,
BVALUE => CLOB2BLOB(LCDATA => CRESPONSE, sCHARSET => 'UTF8'));
end;
end; end;
/ /