forked from CITKParus/P8-ExchangeService
Чуть более умные алгоритмы поиска контрагента и договора (с фильтрацией вспомогательных слов и вычленением ключевых) + тестирование электронной инвентаризации
This commit is contained in:
parent
419696523e
commit
6dcbc4732b
@ -38,10 +38,130 @@ create or replace package UDO_PKG_EXS_TEST as
|
||||
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;
|
||||
/
|
||||
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
|
||||
(
|
||||
@ -188,58 +308,66 @@ create or replace package body UDO_PKG_EXS_TEST as
|
||||
NEXSQUEUE in number -- Ðåãèñòðàöèîííûé íîìåð îáðàáàòûâàåìîé ïîçèöèè î÷åðåäè îáìåíà
|
||||
)
|
||||
is
|
||||
HELPER_PATTERNS THELPER_PATTERNS; -- Êîëëåêöèÿ øàáëîíîâ âñïîìîãàòåëüíûõ ñëîâ ïîèñêà
|
||||
REXSQUEUE EXSQUEUE%rowtype; -- Çàïèñü ïîçèöèè î÷åðåäè
|
||||
CTMP clob; -- Áóôåð äëÿ êîíâåðòàöèè
|
||||
CRESP clob; -- Äàííûå äëÿ îòâåòà
|
||||
RCTMP sys_refcursor; -- Áóôåð äëÿ èçìåíåííîé ïîçèöèè î÷åðåäè
|
||||
begin
|
||||
/* Ñ÷èòàåì çàïèñü î÷åðåäè */
|
||||
REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE);
|
||||
/* Çàáèðàåì äàííûå ñîîáùåíèÿ è êîíâåðòèðóåì â êîäèðîâêó ÁÄ */
|
||||
CTMP := BLOB2CLOB(LBDATA => REXSQUEUE.MSG, SCHARSET => 'UTF8');
|
||||
/* Êëàä¸ì êîíâåðòèðîâàííîå îáðàòíî (ïðîñòî äëÿ óäîáñòâà ìîíèòîðèíãà) */
|
||||
PKG_EXS.QUEUE_MSG_SET(NEXSQUEUE => REXSQUEUE.RN, BMSG => CLOB2BLOB(LCDATA => CTMP), RCQUEUE => RCTMP);
|
||||
/* Åñëè åñòü ÷òî èñêàòü */
|
||||
if (CTMP is not null) then
|
||||
/* Èíèöèàëèçèðóåì îòâåò */
|
||||
CRESP := 'Êîíòðàãåíò "' || CTMP || '" íå íàéäåí';
|
||||
/* Èùåì çàïðîøåííîãî êîíòðàãåíòà */
|
||||
for C in (select T.AGNNAME ||
|
||||
DECODE(T.AGNTYPE, 1, ', ôèçè÷åñêîå ëèöî', ', þðèäè÷åñêîå ëèöî') SAGENT,
|
||||
(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
|
||||
from AGNLIST T
|
||||
where ((STRINLIKE(LOWER(T.AGNABBR), '%' || LOWER(replace(CTMP, ' ', '% %')) || '%', ' ') <> 0) or
|
||||
(STRINLIKE(LOWER(T.AGNNAME), '%' || LOWER(replace(CTMP, ' ', '% %')) || '%', ' ') <> 0))
|
||||
and ROWNUM <= 1)
|
||||
loop
|
||||
CRESP := C.SAGENT;
|
||||
if (C.NCNT_CONTRACTS = 0) then
|
||||
CRESP := CRESP || ', íå èìååò çàðåãèñòðèðîâàííûõ â ñèñòåìå äîãîâîðîâ';
|
||||
else
|
||||
CRESP := CRESP || ', çàðåãèñòðèðîâàíî äîãîâîðîâ: ' || TO_CHAR(C.NCNT_CONTRACTS);
|
||||
if (C.NSUM_CONTRACTS <> 0) then
|
||||
CRESP := CRESP || ', íà îáùóþ ñóììó: ' || TO_CHAR(C.NSUM_CONTRACTS) || ' ðóá.';
|
||||
end if;
|
||||
end if;
|
||||
end loop;
|
||||
else
|
||||
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;
|
||||
begin
|
||||
/* Ñ÷èòàåì çàïèñü î÷åðåäè */
|
||||
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');
|
||||
/* Êëàä¸ì êîíâåðòèðîâàííîå îáðàòíî (ïðîñòî äëÿ óäîáñòâà ìîíèòîðèíãà) */
|
||||
PKG_EXS.QUEUE_MSG_SET(NEXSQUEUE => REXSQUEUE.RN, BMSG => CLOB2BLOB(LCDATA => CTMP), RCQUEUE => RCTMP);
|
||||
/* Åñëè åñòü ÷òî èñêàòü */
|
||||
if (CTMP is not null) then
|
||||
/* Ïîäãîòîâèì ïîèñêîâóþ ôðàçó */
|
||||
CTMP := UTL_SEARCH_STR_PREPARE(SSEARCH_STR => CTMP, SDELIM => ' ', HELPER_PATTERNS => HELPER_PATTERNS);
|
||||
/* Èíèöèàëèçèðóåì îòâåò */
|
||||
CRESP := 'Êîíòðàãåíò íå íàéäåí';
|
||||
/* Èùåì çàïðîøåííîãî êîíòðàãåíòà */
|
||||
for C in (select T.AGNNAME ||
|
||||
DECODE(T.AGNTYPE, 1, ', ôèçè÷åñêîå ëèöî', ', þðèäè÷åñêîå ëèöî') SAGENT,
|
||||
(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
|
||||
from AGNLIST T
|
||||
where ((LOWER(T.AGNABBR) like LOWER(CTMP)) or (LOWER(T.AGNNAME) like LOWER(CTMP)))
|
||||
and ROWNUM <= 1)
|
||||
loop
|
||||
CRESP := C.SAGENT;
|
||||
if (C.NCNT_CONTRACTS = 0) then
|
||||
CRESP := CRESP || ', íå èìååò çàðåãèñòðèðîâàííûõ â ñèñòåìå äîãîâîðîâ';
|
||||
else
|
||||
CRESP := CRESP || ', çàðåãèñòðèðîâàíî äîãîâîðîâ: ' || TO_CHAR(C.NCNT_CONTRACTS);
|
||||
if (C.NSUM_CONTRACTS <> 0) then
|
||||
CRESP := CRESP || ', íà îáùóþ ñóììó: ' || TO_CHAR(C.NSUM_CONTRACTS) || ' ðóá.';
|
||||
end if;
|
||||
end if;
|
||||
end loop;
|
||||
else
|
||||
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
|
||||
(
|
||||
NIDENT in number, -- Èäåíòèôèêàòîð ïðîöåññà
|
||||
NSRV_TYPE in number, -- Òèï ñåðâèñà (ñì. êîíñòàíòû PKG_EXS.NSRV_TYPE*)
|
||||
NEXSQUEUE in number -- Ðåãèñòðàöèîííûé íîìåð îáðàáàòûâàåìîé ïîçèöèè î÷åðåäè îáìåíà
|
||||
NIDENT in number, -- Èäåíòèôèêàòîð ïðîöåññà
|
||||
NSRV_TYPE in number, -- Òèï ñåðâèñà (ñì. êîíñòàíòû PKG_EXS.NSRV_TYPE*)
|
||||
NEXSQUEUE in number -- Ðåãèñòðàöèîííûé íîìåð îáðàáàòûâàåìîé ïîçèöèè î÷åðåäè îáìåíà
|
||||
)
|
||||
is
|
||||
HELPER_PATTERNS THELPER_PATTERNS; -- Êîëëåêöèÿ øàáëîíîâ âñïîìîãàòåëüíûõ ñëîâ ïîèñêà
|
||||
REXSQUEUE EXSQUEUE%rowtype; -- Çàïèñü ïîçèöèè î÷åðåäè
|
||||
CTMP clob; -- Áóôåð äëÿ êîíâåðòàöèè
|
||||
CRESP clob; -- Äàííûå äëÿ îòâåòà
|
||||
@ -247,12 +375,19 @@ create or replace package body UDO_PKG_EXS_TEST as
|
||||
begin
|
||||
/* Ñ÷èòàåì çàïèñü î÷åðåäè */
|
||||
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');
|
||||
/* Êëàä¸ì êîíâåðòèðîâàííîå îáðàòíî (ïðîñòî äëÿ óäîáñòâà ìîíèòîðèíãà) */
|
||||
PKG_EXS.QUEUE_MSG_SET(NEXSQUEUE => REXSQUEUE.RN, BMSG => CLOB2BLOB(LCDATA => CTMP), RCQUEUE => RCTMP);
|
||||
/* Åñëè åñòü ÷òî èñêàòü */
|
||||
if (CTMP is not null) then
|
||||
/* Ïîäãîòîâèì ïîèñêîâóþ ôðàçó */
|
||||
CTMP := UTL_SEARCH_STR_PREPARE(SSEARCH_STR => CTMP, SDELIM => ' ', HELPER_PATTERNS => HELPER_PATTERNS);
|
||||
/* Èùåì çàïðîøåííûé äîãîâîð */
|
||||
begin
|
||||
select DECODE(T.INOUT_SIGN, 0, 'Âõîäÿùèé', 'Èñõîäÿùèé') || ' äîãîâîð ¹' ||
|
||||
@ -264,16 +399,14 @@ create or replace package body UDO_PKG_EXS_TEST as
|
||||
from CONTRACTS T,
|
||||
AGNLIST AG,
|
||||
CURNAMES CN
|
||||
where ((STRINLIKE(LOWER(T.EXT_NUMBER), '%' || LOWER(replace(CTMP, ' ', '% %')) || '%', ' ') <> 0) or
|
||||
(STRINLIKE(LOWER(trim(T.DOC_PREF) || trim(T.DOC_NUMB)),
|
||||
'%' || LOWER(replace(CTMP, ' ', '% %')) || '%',
|
||||
' ') <> 0))
|
||||
where ((LOWER(T.EXT_NUMBER) like LOWER(CTMP)) or
|
||||
(LOWER(trim(T.DOC_PREF) || trim(T.DOC_NUMB)) like LOWER(CTMP)))
|
||||
and T.AGENT = AG.RN
|
||||
and T.CURRENCY = CN.RN
|
||||
and ROWNUM <= 1;
|
||||
exception
|
||||
when NO_DATA_FOUND then
|
||||
CRESP := 'Äîãîâîð "' || CTMP || '" íå íàéäåí';
|
||||
CRESP := 'Äîãîâîð íå íàéäåí';
|
||||
end;
|
||||
else
|
||||
CRESP := 'Íå óêàçàí ïîèñêîâûé çàïðîñ';
|
||||
@ -284,5 +417,353 @@ create or replace package body UDO_PKG_EXS_TEST as
|
||||
BVALUE => CLOB2BLOB(LCDATA => CRESP, SCHARSET => 'UTF8'));
|
||||
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;
|
||||
/
|
||||
|
Loading…
x
Reference in New Issue
Block a user