P8-ExchangeService/db/UDO_PKG_EXS_INV.pck

298 lines
15 KiB
Plaintext

create or replace package UDO_PKG_EXS_INV as
/* Ýëåêòðîííàÿ èíâåíòàðèçàöèÿ - àóòåíòèôèêàöèÿ */
procedure CHECKAUTH
(
NIDENT in number, -- Èäåíòèôèêàòîð ïðîöåññà
NEXSQUEUE in number -- Ðåãèñòðàöèîííûé íîìåð îáðàáàòûâàåìîé ïîçèöèè î÷åðåäè îáìåíà
);
/* Ýëåêòðîííàÿ èíâåíòàðèçàöèÿ - ñ÷èòûâàíèå ïîëüçîâàòåëåé */
procedure GETUSERS
(
NIDENT in number, -- Èäåíòèôèêàòîð ïðîöåññà
NEXSQUEUE in number -- Ðåãèñòðàöèîííûé íîìåð îáðàáàòûâàåìîé ïîçèöèè î÷åðåäè îáìåíà
);
end;
/
create or replace package body UDO_PKG_EXS_INV as
/* Êîíñòàíòû - òýãè */
STSD constant varchar2(20) := 'tsd';
SCHECKAUTHRESPONSE constant varchar2(20) := 'CheckAuthResponse';
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 UTL_CREATENODE
(
XDOC in DBMS_XMLDOM.DOMDOCUMENT, -- Äîêóìåíò
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(ELEM => XEL);
DBMS_XMLDOM.SETPREFIX(N => XNODE, PREFIX => SNS);
else
/* Èëè áåç íåãî */
XEL := DBMS_XMLDOM.CREATEELEMENT(DOC => XDOC, TAGNAME => STAG);
XNODE := DBMS_XMLDOM.MAKENODE(ELEM => XEL);
end if;
/* Çíà÷åíèå ðàçìåùàåì â òåêñòîâîé ÷àñòè âåòêè */
if (SVAL is not null) then
XTEXT := DBMS_XMLDOM.APPENDCHILD(N => XNODE,
NEWCHILD => DBMS_XMLDOM.MAKENODE(T => DBMS_XMLDOM.CREATETEXTNODE(DOC => XDOC,
DATA => SVAL)));
end if;
/* Âåðíåì ðåçóëüòàò */
return XNODE;
end UTL_CREATENODE;
/* Ñ÷èòûâàíèå çíà÷åíèÿ âåòêè XML */
function UTL_GETNODEVAL
(
XROOTNODE in DBMS_XMLDOM.DOMNODE, -- Êîðíåâàÿ âåòêà äëÿ ñ÷èòûâàíèÿ çíà÷åíèÿ
SPATTERN in varchar2 -- Øàáëîí äëÿ ñ÷èòûâàíèÿ äàííûõ
)
return varchar2 -- Ñ÷èòàííîå çíà÷åíèå
is
XNODE DBMS_XMLDOM.DOMNODE; -- Èñêîìàÿ âåòêà ñî çíà÷åíèåì (ïîäõîäÿùàÿ ïîä øàáëîí)
SVAL PKG_STD.TSTRING; -- Ðåçóëüòàò ðàáîòû
begin
/* Íàéäåì íóæíóþ âåòêó ïî øàáëîíó */
XNODE := DBMS_XSLPROCESSOR.SELECTSINGLENODE(N => XROOTNODE, PATTERN => SPATTERN);
/* Åñëè òàì íåò íè÷åãî */
if (DBMS_XMLDOM.ISNULL(N => XNODE)) then
/* Åãî è âåðí¸ì */
return null;
end if;
/* ×òî-òî åñòü - ÷èòàåì äàííûå */
SVAL := DBMS_XMLDOM.GETNODEVALUE(DBMS_XMLDOM.GETFIRSTCHILD(N => XNODE));
/* Îòäà¸ì ðåçóëüòàò */
return SVAL;
end UTL_GETNODEVAL;
/* Ñîçäàíèå äîêóìåíòà äëÿ îòâåòà */
procedure UTL_CREATERESPONSEDOC
(
XDOC out DBMS_XMLDOM.DOMDOCUMENT -- Áóôåð äëÿ äîêóìåíòà
)
is
begin
/* Ñîçäà¸ì íîâûé äîêóìåíò */
XDOC := DBMS_XMLDOM.NEWDOMDOCUMENT();
/* Âûñòàâëÿåì ïàðàìåòðû çàãîëîâêà */
DBMS_XMLDOM.SETVERSION(DOC => XDOC, VERSION => '1.0" encoding="UTF-8');
/* Âûñòàâëÿåì êîäèðîâêó */
DBMS_XMLDOM.SETCHARSET(DOC => XDOC, CHARSET => 'UTF-8');
end UTL_CREATERESPONSEDOC;
/* Ôîðìèðîâíèå îòâåòà íà çàïðîñ èç XML-äîêóìåíòà (îá¸ðòûâàíèå â êîíâåðò ïîäãîòîâëåííûõ äàííûõ) */
function UTL_CREATERESPONSE
(
XDOC in DBMS_XMLDOM.DOMDOCUMENT, -- Äîêóìåíò
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
/* Ïîäãîòîâèì äîêóìåíò */
XMAIN_NODE := DBMS_XMLDOM.MAKENODE(DOC => XDOC);
/* Îáåðí¸ì åãî â êîíâåðò */
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(ELEM => XENVELOPE_EL);
DBMS_XMLDOM.SETPREFIX(N => XENVELOPE, PREFIX => SSOAPENV);
XENVELOPE := DBMS_XMLDOM.APPENDCHILD(N => XMAIN_NODE, NEWCHILD => XENVELOPE);
/* Ñôîðìèðóåì çàãîëîâîê */
XHEADER := UTL_CREATENODE(XDOC => XDOC, STAG => SHEADER, SNS => SSOAPENV);
XHEADER := DBMS_XMLDOM.APPENDCHILD(N => XENVELOPE, NEWCHILD => XHEADER);
/* Ñôîðìèðóåì òåëî */
XBODY := UTL_CREATENODE(XDOC => XDOC, STAG => SBODY, SNS => 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(DOC => XDOC, CL => CDATA, CHARSET => 'UTF-8');
DBMS_XMLDOM.FREEDOCUMENT(DOC => XDOC);
/* Âåðíåì ðåçóëüòàò */
return CDATA;
end UTL_CREATERESPONSE;
/* Ýëåêòðîííàÿ èíâåíòàðèçàöèÿ - àóòåíòèôèêàöèÿ */
procedure CHECKAUTH
(
NIDENT in number, -- Èäåíòèôèêàòîð ïðîöåññà
NEXSQUEUE in number -- Ðåãèñòðàöèîííûé íîìåð îáðàáàòûâàåìîé ïîçèöèè î÷åðåäè îáìåíà
)
is
REXSQUEUE EXSQUEUE%rowtype; -- Çàïèñü ïîçèöèè î÷åðåäè
XCHECKAUTHRESPONSE DBMS_XMLDOM.DOMNODE; -- Êîðíåâîé ýëåìåíò îòâåòà
XRESULT DBMS_XMLDOM.DOMNODE; -- Ðåçóëüòàò àóòåíòèôèêàöèè
XNODE DBMS_XMLDOM.DOMNODE; -- Áóôåð äëÿ âåòêè îòâåòà
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; -- Êîðíåâîé ýëåìåíò ïåðâîé âåòêè òåëà äîêóìåíòà
CRESPONSE clob; -- Áóôåð äëÿ îòâåòà
CREQ clob; -- Áóôåð äëÿ çàïðîñà
SREQDEVICEID varchar2(30); -- Èäåíòèôèêàòîð óñòðîéñòâà èç çàïðîñà
begin
/* Ñ÷èòàåì çàïèñü î÷åðåäè */
REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE);
/* Âîçüìåì òåêñò çàïðîñà */
CREQ := BLOB2CLOB(LBDATA => REXSQUEUE.MSG);
/* Ñîçäàåì èíñòàíñ XML ïàðñåðà */
XMLPARCER := DBMS_XMLPARSER.NEWPARSER;
/* Ðàçáèðàåì XML èç çàïðîñà */
DBMS_XMLPARSER.PARSECLOB(P => XMLPARCER, DOC => CREQ);
/* Áåðåì XML äîêóìåíò èç ðàçîáðàííîãî */
XDOC := DBMS_XMLPARSER.GETDOCUMENT(P => XMLPARCER);
/* Ñ÷èòûâàåì êîðíåâîé ýëåìåíò */
XENVELOPE := DBMS_XMLDOM.MAKENODE(ELEM => DBMS_XMLDOM.GETDOCUMENTELEMENT(DOC => XDOC));
/* Ñ÷èòûâàåì ýëåìåíò òåëî */
XBODY := DBMS_XSLPROCESSOR.SELECTSINGLENODE(N => XENVELOPE, PATTERN => SBODY);
/* Ñ÷èòûâàåì äî÷åðíèå ýëåìåíòû òåëà */
XNODELIST := DBMS_XMLDOM.GETCHILDNODES(N => XBODY);
/* Áåðåì ïåðâûé äî÷åðíèé ýëåìåíò */
XNODE_ROOT := DBMS_XMLDOM.ITEM(NL => XNODELIST, IDX => 0);
/* Ñ÷èòûâàåì èäåíòèôèêàòîð óñòðîéñòâà */
SREQDEVICEID := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SDEVICEID);
/* Êîíòðîëü èíäåòèôèêàòîðà óñòðîéñòâà ïî ëèöåíçèè */
/* UTL_CHECK_DEVICEID(SDEVICEID => SREQDEVICEID); */
/* Ïîäãîòàâëèâàåì äîêóìåíò äëÿ îòâåòà */
UTL_CREATERESPONSEDOC(XDOC => XDOC);
/* Âìåñòî ïðîâåðêè ïî ëèöåíçèè - ïîêà ïðîñòî ïðîâåðêà íà òî, ÷òî èäåíòèôèêàòîð óñòðîéñòâà áûë ïåðåäàí */
if (SREQDEVICEID is not null) then
/* Ò.ê. ïîêà ïðîâåðîê íåò íèêàêèõ - âñåãäà âîçâðàùàåì ïîëîæèòåëüíûé îòâåò */
XCHECKAUTHRESPONSE := UTL_CREATENODE(XDOC => XDOC, STAG => SCHECKAUTHRESPONSE, SNS => STSD);
XRESULT := UTL_CREATENODE(XDOC => XDOC, STAG => SRESULT, SNS => STSD, SVAL => 'true');
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XCHECKAUTHRESPONSE, NEWCHILD => XRESULT);
/* Îáîðà÷èâàåì åãî â êîíâåðò */
CRESPONSE := UTL_CREATERESPONSE(XDOC => XDOC, XCONTENT => XCHECKAUTHRESPONSE);
end if;
/* Âîçâðàùàåì îòâåò */
PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT,
SRESULT => PKG_EXS.SPRC_RESP_RESULT_OK,
BRESP => CLOB2BLOB(LCDATA => CRESPONSE, SCHARSET => 'UTF8'));
exception
when others then
/* Âåðí¸ì îøèáêó */
PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT, SRESULT => PKG_EXS.SPRC_RESP_RESULT_ERR, SMSG => sqlerrm);
end CHECKAUTH;
/* Ýëåêòðîííàÿ èíâåíòàðèçàöèÿ - ñ÷èòûâàíèå ïîëüçîâàòåëåé */
procedure GETUSERS
(
NIDENT in number, -- Èäåíòèôèêàòîð ïðîöåññà
NEXSQUEUE in number -- Ðåãèñòðàöèîííûé íîìåð îáðàáàòûâàåìîé ïîçèöèè î÷åðåäè îáìåíà
)
is
REXSQUEUE EXSQUEUE%rowtype; -- Çàïèñü ïîçèöèè î÷åðåäè
XGETUSERSRESPONSE DBMS_XMLDOM.DOMNODE; -- Êîðíåâîé ýëåìåíò îòâåòà
XNODE DBMS_XMLDOM.DOMNODE; -- Áóôåð äëÿ âåòêè îòâåòà
XITEM DBMS_XMLDOM.DOMNODE; -- Ýëåìåíò îòâåòíîãî ñïèñêà
XCODE DBMS_XMLDOM.DOMNODE; -- Êîä ýëåìåíòà îòâåòíîãî ñïèñêà
XNAME DBMS_XMLDOM.DOMNODE; -- Íèìåíîâàíèå ýëåìåíòà îòâåòíîãî ñïèñêà
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; -- Êîðíåâîé ýëåìåíò ïåðâîé âåòêè òåëà äîêóìåíòà
CRESPONSE clob; -- Áóôåð äëÿ îòâåòà
CREQ clob; -- Áóôåð äëÿ çàïðîñà
SREQDEVICEID varchar2(30); -- Èäåíòèôèêàòîð óñòðîéñòâà èç çàïðîñà
begin
/* Ñ÷èòàåì çàïèñü î÷åðåäè */
REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE);
/* Âîçüìåì òåêñò çàïðîñà */
CREQ := BLOB2CLOB(LBDATA => REXSQUEUE.MSG);
/* Ñîçäàåì èíñòàíñ XML ïàðñåðà */
XMLPARCER := DBMS_XMLPARSER.NEWPARSER;
/* Ðàçáèðàåì XML èç çàïðîñà */
DBMS_XMLPARSER.PARSECLOB(P => XMLPARCER, DOC => CREQ);
/* Áåðåì XML äîêóìåíò èç ðàçîáðàííîãî */
XDOC := DBMS_XMLPARSER.GETDOCUMENT(P => XMLPARCER);
/* Ñ÷èòûâàåì êîðíåâîé ýëåìåíò */
XENVELOPE := DBMS_XMLDOM.MAKENODE(ELEM => DBMS_XMLDOM.GETDOCUMENTELEMENT(DOC => XDOC));
/* Ñ÷èòûâàåì ýëåìåíò òåëî */
XBODY := DBMS_XSLPROCESSOR.SELECTSINGLENODE(N => XENVELOPE, PATTERN => SBODY);
/* Ñ÷èòûâàåì äî÷åðíèå ýëåìåíòû òåëà */
XNODELIST := DBMS_XMLDOM.GETCHILDNODES(N => XBODY);
/* Áåðåì ïåðâûé äî÷åðíèé ýëåìåíò */
XNODE_ROOT := DBMS_XMLDOM.ITEM(NL => XNODELIST, IDX => 0);
/* Ñ÷èòûâàåì èäåíòèôèêàòîð óñòðîéñòâà */
SREQDEVICEID := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SDEVICEID);
/* Êîíòðîëü èíäåòèôèêàòîðà óñòðîéñòâà ïî ëèöåíçèè */
/* UTL_CHECK_DEVICEID(SDEVICEID => SREQDEVICEID); */
/* Ïîäãîòàâëèâàåì äîêóìåíò äëÿ îòâåòà */
UTL_CREATERESPONSEDOC(XDOC => XDOC);
/* Âìåñòî ïðîâåðêè ïî ëèöåíçèè - ïîêà ïðîñòî ïðîâåðêà íà òî, ÷òî èäåíòèôèêàòîð óñòðîéñòâà áûë ïåðåäàí */
if (SREQDEVICEID is not null) then
/* Ñîçäà¸ì ïðîñòðàíñòâî èì¸í äëÿ îòâåòà */
XGETUSERSRESPONSE := UTL_CREATENODE(XDOC => XDOC, STAG => SGETUSERSRESPONSE, SNS => 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 := UTL_CREATENODE(XDOC => XDOC, STAG => SITEM, SNS => STSD);
XCODE := UTL_CREATENODE(XDOC => XDOC, STAG => SCODE, SNS => STSD, SVAL => REC.RN);
XNAME := UTL_CREATENODE(XDOC => XDOC, STAG => SNAME, SNS => STSD, SVAL => 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 := UTL_CREATERESPONSE(XDOC => XDOC, XCONTENT => XGETUSERSRESPONSE);
end if;
/* Âîçâðàùàåì îòâåò */
PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT,
SRESULT => PKG_EXS.SPRC_RESP_RESULT_OK,
BRESP => CLOB2BLOB(LCDATA => CRESPONSE, SCHARSET => 'UTF8'));
exception
when others then
/* Âåðí¸ì îøèáêó */
PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT, SRESULT => PKG_EXS.SPRC_RESP_RESULT_ERR, SMSG => sqlerrm);
end GETUSERS;
end;
/