815 lines
39 KiB
Plaintext
815 lines
39 KiB
Plaintext
create or replace package PKG_P8PANELS_BASE as
|
|
|
|
/*Êîíñòàíòû - Òèïîâîé ïîñòôèêñ òåãà äëÿ ìàññèâà (ïðè ïåðåâîäå XML -> JSON) */
|
|
SXML_ALWAYS_ARRAY_POSTFIX constant PKG_STD.TSTRING := '__SYSTEM__ARRAY__';
|
|
|
|
/* Êîíâåðòàöèÿ ñòðîêè â ÷èñëî */
|
|
function UTL_S2N
|
|
(
|
|
SVALUE in varchar2 -- Êîíâåðòèðóåìîå ñòðîêîâîå çíà÷åíèå
|
|
) return number; -- Êîíâåðòèðîâàííîå ÷èñëî
|
|
|
|
/* Êîíâåðòàöèÿ äàòû â ÷èñëî */
|
|
function UTL_S2D
|
|
(
|
|
SVALUE in varchar2 -- Êîíâåðòèðóåìîå ñòðîêîâîå çíà÷åíèå
|
|
) return date; -- Êîíâåðòèðîâàííàÿ äàòà
|
|
|
|
/* Áàçîâîå èñïîëíåíèå äåéñòâèé */
|
|
procedure PROCESS
|
|
(
|
|
CIN in clob, -- Âõîäíûå ïàðàìåòðû
|
|
COUT out clob -- Ðåçóëüòàò
|
|
);
|
|
|
|
end PKG_P8PANELS_BASE;
|
|
/
|
|
create or replace package body PKG_P8PANELS_BASE as
|
|
|
|
/* Êîíñòàíòû - êîäû äåñòâèé çàïðîñîâ */
|
|
SRQ_ACTION_EXEC_STORED constant PKG_STD.TSTRING := 'EXEC_STORED'; -- Çàïðîñ íà èñïîëíåíèå õðàíèìîé ïðîöåäóðû
|
|
|
|
/* Êîíñòàíòû - òýãè çàïðîñîâ */
|
|
SRQ_TAG_XREQUEST constant PKG_STD.TSTRING := 'XREQUEST'; -- Êîðíåâîé òýã çàïðîñà
|
|
SRQ_TAG_XPAYLOAD constant PKG_STD.TSTRING := 'XPAYLOAD'; -- Òýã äëÿ äàííûõ çàïðîñà
|
|
SRQ_TAG_SACTION constant PKG_STD.TSTRING := 'SACTION'; -- Òýã äëÿ äåéñòâèÿ çàïðîñà
|
|
SRQ_TAG_SSTORED constant PKG_STD.TSTRING := 'SSTORED'; -- Òýã äëÿ èìåíè õðàíèìîãî îáúåêòà â çàïðîñå
|
|
SRQ_TAG_SRESP_ARG constant PKG_STD.TSTRING := 'SRESP_ARG'; -- Òýã äëÿ èìåíè àðãóìåíòà, ôîðìèðóþùåãî äàííûå îòâåòà
|
|
SRQ_TAG_XARGUMENTS constant PKG_STD.TSTRING := 'XARGUMENTS'; -- Òýã äëÿ ñïèñêà àðãóìåíòîâ õðàíèìîãî îáúåêòà/âûáîðêè â çàïðîñå
|
|
SRQ_TAG_XARGUMENT constant PKG_STD.TSTRING := 'XARGUMENT'; -- Òýã äëÿ àðãóìåíòà õðàíèìîãî îáúåêòà/âûáîðêè â çàïðîñå
|
|
SRQ_TAG_SNAME constant PKG_STD.TSTRING := 'SNAME'; -- Òýã äëÿ íàèìåíîâàíèÿ â çàïðîñå
|
|
SRQ_TAG_SDATA_TYPE constant PKG_STD.TSTRING := 'SDATA_TYPE'; -- Òýã äëÿ òèïà äàííûõ â çàïðîñå
|
|
SRQ_TAG_VALUE constant PKG_STD.TSTRING := 'VALUE'; -- Òýã äëÿ çíà÷åíèÿ â çàïðîñå
|
|
|
|
/* Êîíñòàíòû - òýãè îòâåòîâ */
|
|
SRESP_TAG_XPAYLOAD constant PKG_STD.TSTRING := 'XPAYLOAD'; -- Òýã äëÿ äàííûõ îòâåòà
|
|
SRESP_TAG_XOUT_ARGUMENTS constant PKG_STD.TSTRING := 'XOUT_ARGUMENTS'; -- Òýã äëÿ âûõîäíûõ àðãóìåíòîâ õðàíèìîãî îáúåêòà â îòâåòå
|
|
SRESP_TAG_SDATA_TYPE constant PKG_STD.TSTRING := 'SDATA_TYPE'; -- Òýã äëÿ òèïà äàííûõ â îòâåòå
|
|
SRESP_TAG_VALUE constant PKG_STD.TSTRING := 'VALUE'; -- Òýã äëÿ çíà÷åíèÿ â îòâåòå
|
|
SRESP_TAG_SNAME constant PKG_STD.TSTRING := 'SNAME'; -- Òýã äëÿ íàèìåíîâàíèÿ â îòâåòå
|
|
|
|
/* Êîíñòàíòû - òèïû äàííûõ */
|
|
SDATA_TYPE_STR constant PKG_STD.TSTRING := 'STR'; -- Òèï äàííûõ "ñòðîêà"
|
|
SDATA_TYPE_NUMB constant PKG_STD.TSTRING := 'NUMB'; -- Òèï äàííûõ "÷èñëî"
|
|
SDATA_TYPE_DATE constant PKG_STD.TSTRING := 'DATE'; -- Òèï äàííûõ "äàòà"
|
|
SDATA_TYPE_CLOB constant PKG_STD.TSTRING := 'CLOB'; -- Òèï äàííûõ "òåêñò"
|
|
|
|
/* Êîíñòàíòû - ñîñòîÿíèÿ îáúåêòîâ ÁÄ */
|
|
SDB_OBJECT_STATE_VALID constant PKG_STD.TSTRING := 'VALID'; -- Îáúåêò âàëèäåí
|
|
|
|
/* Òèïû äàííûõ - àðãóìåíòû */
|
|
type TARGUMENT is record
|
|
(
|
|
SNAME PKG_STD.TSTRING, -- Íàèìåíîâàíèå
|
|
SDATA_TYPE PKG_STD.TSTRING, -- Òèï äàííûõ (ñì. êîíñòàíòû SPWS_DATA_TYPE_*)
|
|
SVALUE PKG_STD.TSTRING, -- Çíà÷åíèå (ñòðîêà)
|
|
NVALUE PKG_STD.TLNUMBER, -- Çíà÷åíèå (÷èñëî)
|
|
DVALUE PKG_STD.TLDATE, -- Çíà÷åíèå (äàòà)
|
|
CVALUE clob -- Çíà÷åíèå (òåêñò)
|
|
);
|
|
|
|
/* Òèïû äàííûõ - êîëëåêöèÿ àðãóìåíòîâ çàïðîñà */
|
|
type TARGUMENTS is table of TARGUMENT;
|
|
|
|
/* Êîíâåðòàöèÿ ñòðîêè â ÷èñëî */
|
|
function UTL_S2N
|
|
(
|
|
SVALUE in varchar2 -- Êîíâåðòèðóåìîå ñòðîêîâîå çíà÷åíèå
|
|
) return number -- Êîíâåðòèðîâàííîå ÷èñëî
|
|
is
|
|
NVALUE PKG_STD.TNUMBER; -- Ðåçóëüòàò ðàáîòû
|
|
begin
|
|
/* Ïðîáóåì êîíâåðòèðîâàòü */
|
|
NVALUE := TO_NUMBER(replace(SVALUE, ',', '.'));
|
|
/* Îòäà¸ì ðåçóëüòàò */
|
|
return NVALUE;
|
|
exception
|
|
when others then
|
|
P_EXCEPTION(0, 'Íåâåðíûé ôîðìàò ÷èñëà (%s).', SVALUE);
|
|
end UTL_S2N;
|
|
|
|
/* Êîíâåðòàöèÿ äàòû â ÷èñëî */
|
|
function UTL_S2D
|
|
(
|
|
SVALUE in varchar2 -- Êîíâåðòèðóåìîå ñòðîêîâîå çíà÷åíèå
|
|
) return date -- Êîíâåðòèðîâàííàÿ äàòà
|
|
is
|
|
DVALUE PKG_STD.TLDATE; -- Ðåçóëüòàò ðàáîòû
|
|
begin
|
|
/* Ïðîáóåì êîíâåðòèðîâàòü */
|
|
begin
|
|
DVALUE := TO_DATE(SVALUE, 'YYYY-MM-DD');
|
|
exception
|
|
when others then
|
|
begin
|
|
DVALUE := TO_DATE(SVALUE, 'YYYY/MM/DD');
|
|
exception
|
|
when others then
|
|
begin
|
|
DVALUE := TO_DATE(SVALUE, 'DD.MM.YYYY');
|
|
exception
|
|
when others then
|
|
DVALUE := TO_DATE(SVALUE, 'DD/MM/YYYY');
|
|
end;
|
|
end;
|
|
end;
|
|
/* Îòäà¸ì ðåçóëüòàò */
|
|
return DVALUE;
|
|
exception
|
|
when others then
|
|
P_EXCEPTION(0, 'Íåâåðíûé ôîðìàò äàòû (%s).', SVALUE);
|
|
end UTL_S2D;
|
|
|
|
/* Ôîðìèðîâàíèå ñîîáùåíèÿ îá îòñóòñòâèè çíà÷åíèÿ */
|
|
function MSG_NO_DATA_MAKE
|
|
(
|
|
SPATH in varchar2 := null, -- Ïóòü ïî êîòîðîìó îæèäàëîñü çíà÷åíèå
|
|
SMESSAGE_OBJECT in varchar2 := null -- Íàèìåìíîâàíèå îáúåêòà äëÿ ôîðìóëèðîâàíèÿ ñîîáùåíèÿ îá îøèáêå
|
|
) return varchar2 -- Ñôîðìèðîâàííîå ñîîáùåíèå îá îøèáêå
|
|
is
|
|
SPATH_ PKG_STD.TSTRING; -- Áóôåð äëÿ ïóòè
|
|
SMESSAGE_OBJECT_ PKG_STD.TSTRING; -- Áóôåð äëÿ íàèìåíîâàíèÿ îáúåêòà
|
|
begin
|
|
/* Ïîäãîòîâèì ïóòü ê âûäà÷å */
|
|
if (SPATH is not null) then
|
|
SPATH_ := ' (' || SPATH || ')';
|
|
end if;
|
|
/* Ïîäãîòîâèì íàèìåíîâàíèå îáúåêòà ê âûäà÷å */
|
|
if (SMESSAGE_OBJECT is not null) then
|
|
SMESSAGE_OBJECT_ := ' ýëåìåíòà "' || SMESSAGE_OBJECT || '"';
|
|
else
|
|
SMESSAGE_OBJECT_ := ' ýëåìåíòà';
|
|
end if;
|
|
/* Âåðí¸ì ñôîðìèðîâàííîå ñîîáùåíèå */
|
|
return 'Íå óêàçàíî çíà÷åíèå' || SMESSAGE_OBJECT_ || SPATH_ || '.';
|
|
end MSG_NO_DATA_MAKE;
|
|
|
|
/* Êîíâåðòàöèÿ ñòàíäàðòíîãî òèïà äàííûõ (PKG_STD) â òèï äàííûõ ñåðâèñà (PWS) */
|
|
function STD_DATA_TYPE_TO_STR
|
|
(
|
|
NSTD_DATA_TYPE in number -- Ñòàíàðòíûé òèï äàííûõ
|
|
) return varchar2 -- Ñîîòâåòñòâóþùèé òèï äàííûõ ñåðâèñà
|
|
is
|
|
SRES PKG_STD.TSTRING; -- Áóôåð äëÿ ðåçóëüòàòà
|
|
begin
|
|
/* Ðàáîòàåì îò òèïà äàííûõ */
|
|
case NSTD_DATA_TYPE
|
|
/* Ñòðîêà */
|
|
when PKG_STD.DATA_TYPE_STR then
|
|
SRES := SDATA_TYPE_STR;
|
|
/* ×èñëî */
|
|
when PKG_STD.DATA_TYPE_NUM then
|
|
SRES := SDATA_TYPE_NUMB;
|
|
/* Äàòà */
|
|
when PKG_STD.DATA_TYPE_DATE then
|
|
SRES := SDATA_TYPE_DATE;
|
|
/* Òåêñò */
|
|
when PKG_STD.DATA_TYPE_CLOB then
|
|
SRES := SDATA_TYPE_CLOB;
|
|
/* Íåèçâåñòíûé òèï äàííûõ */
|
|
else
|
|
P_EXCEPTION(0, 'Òèï äàííûõ "%s" íå ïîääåðæèâàåòñÿ.', TO_CHAR(NSTD_DATA_TYPE));
|
|
end case;
|
|
/* Âîçâðàùàåì ðåçóëüòàò */
|
|
return SRES;
|
|
end STD_DATA_TYPE_TO_STR;
|
|
|
|
/* Ñ÷èòûâàíèå çíà÷åíèÿ âåòêè XML (ñòðîêà) */
|
|
function NODE_SVAL_GET
|
|
(
|
|
XROOT in PKG_XPATH.TNODE, -- Êîðíåâàÿ âåòêà äëÿ ñ÷èòûâàíèÿ çíà÷åíèÿ
|
|
SPATH in varchar2, -- Ïóòü äëÿ ñ÷èòûâàíèÿ äàííûõ
|
|
NREQUIRED in number := 0, -- Ôëàã âûäà÷è ñîîáùåíèÿ îá îøèáêå â ñëó÷àå îòñóòñòâèÿ çíà÷åíèÿ (0 - íå âûäàâàòü, 1 - âûäàâàòü)
|
|
SMESSAGE_OBJECT in varchar2 := null -- Íàèìåìíîâàíèå îáúåêòà äëÿ ôîðìóëèðîâàíèÿ ñîîáùåíèÿ îá îøèáêå
|
|
) return varchar2 -- Ñ÷èòàííîå çíà÷åíèå
|
|
is
|
|
XNODE PKG_XPATH.TNODE; -- Èñêîìàÿ âåòêà ñî çíà÷åíèåì (ïîäõîäÿùàÿ ïîä øàáëîí)
|
|
SVAL PKG_STD.TSTRING; -- Ðåçóëüòàò ðàáîòû
|
|
begin
|
|
/* Íàéäåì íóæíóþ âåòêó ïî øàáëîíó */
|
|
XNODE := PKG_XPATH.SINGLE_NODE(RPARENT_NODE => XROOT, SPATTERN => SPATH);
|
|
/* Åñëè òàì íåò íè÷åãî */
|
|
if (PKG_XPATH.IS_NULL(RNODE => XNODE)) then
|
|
/* Åãî è âåðí¸ì */
|
|
SVAL := null;
|
|
else
|
|
/* ×òî-òî åñòü - ÷èòàåì äàííûå */
|
|
begin
|
|
SVAL := PKG_XPATH.VALUE(RNODE => XNODE);
|
|
exception
|
|
when others then
|
|
P_EXCEPTION(0, 'Íåâåðíûé ôîðìàò ñòðîêè (%s).', SPATH);
|
|
end;
|
|
end if;
|
|
/* Åñëè çíà÷åíèÿ íåò, à îíî äîëæíî áûòü - ñêàæåì îá ýòîì */
|
|
if ((SVAL is null) and (NREQUIRED = 1)) then
|
|
P_EXCEPTION(0, MSG_NO_DATA_MAKE(SPATH => SPATH, SMESSAGE_OBJECT => SMESSAGE_OBJECT));
|
|
end if;
|
|
/* Îòäà¸ì ðåçóëüòàò */
|
|
return SVAL;
|
|
end NODE_SVAL_GET;
|
|
|
|
/* Ñ÷èòûâàíèå çíà÷åíèÿ âåòêè XML (÷èñëî) */
|
|
function NODE_NVAL_GET
|
|
(
|
|
XROOT in PKG_XPATH.TNODE, -- Êîðíåâàÿ âåòêà äëÿ ñ÷èòûâàíèÿ çíà÷åíèÿ
|
|
SPATH in varchar2, -- Ïóòü äëÿ ñ÷èòûâàíèÿ äàííûõ
|
|
NREQUIRED in number := 0, -- Ôëàã âûäà÷è ñîîáùåíèÿ îá îøèáêå â ñëó÷àå îòñóòñòâèÿ çíà÷åíèÿ (0 - íå âûäàâàòü, 1 - âûäàâàòü)
|
|
SMESSAGE_OBJECT in varchar2 := null -- Íàèìåìíîâàíèå îáúåêòà äëÿ ôîðìóëèðîâàíèÿ ñîîáùåíèÿ îá îøèáêå
|
|
) return number -- Ñ÷èòàííîå çíà÷åíèå
|
|
is
|
|
XNODE PKG_XPATH.TNODE; -- Èñêîìàÿ âåòêà ñî çíà÷åíèåì (ïîäõîäÿùàÿ ïîä øàáëîí)
|
|
NVAL PKG_STD.TLNUMBER; -- Ðåçóëüòàò ðàáîòû
|
|
begin
|
|
/* Íàéäåì íóæíóþ âåòêó ïî øàáëîíó */
|
|
XNODE := PKG_XPATH.SINGLE_NODE(RPARENT_NODE => XROOT, SPATTERN => SPATH);
|
|
/* Åñëè òàì íåò íè÷åãî */
|
|
if (PKG_XPATH.IS_NULL(RNODE => XNODE)) then
|
|
/* Åãî è âåðí¸ì */
|
|
NVAL := null;
|
|
else
|
|
/* ×òî-òî åñòü - ÷èòàåì äàííûå */
|
|
begin
|
|
NVAL := PKG_XPATH.VALUE_NUM(RNODE => XNODE);
|
|
exception
|
|
when others then
|
|
P_EXCEPTION(0, 'Íåâåðíûé ôîðìàò ÷èñëà (%s).', SPATH);
|
|
end;
|
|
end if;
|
|
/* Åñëè çíà÷åíèÿ íåò, à îíî äîëæíî áûòü - ñêàæåì îá ýòîì */
|
|
if ((NVAL is null) and (NREQUIRED = 1)) then
|
|
P_EXCEPTION(0, MSG_NO_DATA_MAKE(SPATH => SPATH, SMESSAGE_OBJECT => SMESSAGE_OBJECT));
|
|
end if;
|
|
/* Îòäà¸ì ðåçóëüòàò */
|
|
return NVAL;
|
|
end NODE_NVAL_GET;
|
|
|
|
/* Ñ÷èòûâàíèå çíà÷åíèÿ âåòêè XML (äàòà) */
|
|
function NODE_DVAL_GET
|
|
(
|
|
XROOT in PKG_XPATH.TNODE, -- Êîðíåâàÿ âåòêà äëÿ ñ÷èòûâàíèÿ çíà÷åíèÿ
|
|
SPATH in varchar2, -- Ïóòü äëÿ ñ÷èòûâàíèÿ äàííûõ
|
|
NREQUIRED in number := 0, -- Ôëàã âûäà÷è ñîîáùåíèÿ îá îøèáêå â ñëó÷àå îòñóòñòâèÿ çíà÷åíèÿ (0 - íå âûäàâàòü, 1 - âûäàâàòü)
|
|
SMESSAGE_OBJECT in varchar2 := null -- Íàèìåìíîâàíèå îáúåêòà äëÿ ôîðìóëèðîâàíèÿ ñîîáùåíèÿ îá îøèáêå
|
|
) return date -- Ñ÷èòàííîå çíà÷åíèå
|
|
is
|
|
XNODE PKG_XPATH.TNODE; -- Èñêîìàÿ âåòêà ñî çíà÷åíèåì (ïîäõîäÿùàÿ ïîä øàáëîí)
|
|
DVAL PKG_STD.TLDATE; -- Ðåçóëüòàò ðàáîòû
|
|
begin
|
|
/* Íàéäåì íóæíóþ âåòêó ïî øàáëîíó */
|
|
XNODE := PKG_XPATH.SINGLE_NODE(RPARENT_NODE => XROOT, SPATTERN => SPATH);
|
|
/* Åñëè òàì íåò íè÷åãî */
|
|
if (PKG_XPATH.IS_NULL(RNODE => XNODE)) then
|
|
/* Åãî è âåðí¸ì */
|
|
DVAL := null;
|
|
else
|
|
/* ×òî-òî åñòü - ÷èòàåì äàííûå */
|
|
begin
|
|
DVAL := PKG_XPATH.VALUE_DATE(RNODE => XNODE);
|
|
exception
|
|
when others then
|
|
begin
|
|
DVAL := PKG_XPATH.VALUE_TS(RNODE => XNODE);
|
|
exception
|
|
when others then
|
|
begin
|
|
DVAL := PKG_XPATH.VALUE_TZ(RNODE => XNODE);
|
|
exception
|
|
when others then
|
|
P_EXCEPTION(0,
|
|
'Íåâåðíûé ôîðìàò äàòû (%s). Îæèäàëîñü: YYYY-MM-DD"T"HH24:MI:SS.FF3tzh:tzm, YYYY-MM-DD"T"HH24:MI:SS.FF3, YYYY-MM-DD"T"HH24:MI:SS, YYYY-MM-DD.',
|
|
SPATH);
|
|
end;
|
|
end;
|
|
end;
|
|
end if;
|
|
/* Åñëè çíà÷åíèÿ íåò, à îíî äîëæíî áûòü - ñêàæåì îá ýòîì */
|
|
if ((DVAL is null) and (NREQUIRED = 1)) then
|
|
P_EXCEPTION(0, MSG_NO_DATA_MAKE(SPATH => SPATH, SMESSAGE_OBJECT => SMESSAGE_OBJECT));
|
|
end if;
|
|
/* Îòäà¸ì ðåçóëüòàò */
|
|
return DVAL;
|
|
end NODE_DVAL_GET;
|
|
|
|
/* Ñ÷èòûâàíèå çíà÷åíèÿ âåòêè XML (òåêñò) */
|
|
function NODE_CVAL_GET
|
|
(
|
|
XROOT in PKG_XPATH.TNODE, -- Êîðíåâàÿ âåòêà äëÿ ñ÷èòûâàíèÿ çíà÷åíèÿ
|
|
SPATH in varchar2, -- Ïóòü äëÿ ñ÷èòûâàíèÿ äàííûõ
|
|
NREQUIRED in number := 0, -- Ôëàã âûäà÷è ñîîáùåíèÿ îá îøèáêå â ñëó÷àå îòñóòñòâèÿ çíà÷åíèÿ (0 - íå âûäàâàòü, 1 - âûäàâàòü)
|
|
SMESSAGE_OBJECT in varchar2 := null -- Íàèìåìíîâàíèå îáúåêòà äëÿ ôîðìóëèðîâàíèÿ ñîîáùåíèÿ îá îøèáêå
|
|
) return clob -- Ñ÷èòàííîå çíà÷åíèå
|
|
is
|
|
XNODE PKG_XPATH.TNODE; -- Èñêîìàÿ âåòêà ñî çíà÷åíèåì (ïîäõîäÿùàÿ ïîä øàáëîí)
|
|
CVAL clob; -- Ðåçóëüòàò ðàáîòû
|
|
begin
|
|
/* Íàéäåì íóæíóþ âåòêó ïî øàáëîíó */
|
|
XNODE := PKG_XPATH.SINGLE_NODE(RPARENT_NODE => XROOT, SPATTERN => SPATH);
|
|
/* Åñëè òàì íåò íè÷åãî */
|
|
if (PKG_XPATH.IS_NULL(RNODE => XNODE)) then
|
|
/* Åãî è âåðí¸ì */
|
|
CVAL := null;
|
|
else
|
|
/* ×òî-òî åñòü - ÷èòàåì äàííûå */
|
|
begin
|
|
CVAL := PKG_XPATH.VALUE_CLOB(RNODE => XNODE);
|
|
exception
|
|
when others then
|
|
P_EXCEPTION(0, 'Íåâåðíûé ôîðìàò òåêñòîâûõ äàííûõ (%s).', SPATH);
|
|
end;
|
|
end if;
|
|
/* Åñëè çíà÷åíèÿ íåò, à îíî äîëæíî áûòü - ñêàæåì îá ýòîì */
|
|
if ((CVAL is null) and (NREQUIRED = 1)) then
|
|
P_EXCEPTION(0, MSG_NO_DATA_MAKE(SPATH => SPATH, SMESSAGE_OBJECT => SMESSAGE_OBJECT));
|
|
end if;
|
|
/* Îòäà¸ì ðåçóëüòàò */
|
|
return CVAL;
|
|
end NODE_CVAL_GET;
|
|
|
|
/* Ñ÷èòûâàíèå àðãóìåíòà èç êîëëåêöèè */
|
|
function TARGUMENTS_GET
|
|
(
|
|
ARGUMENTS in TARGUMENTS, -- Êîëëåêöèÿ àðãóìåíòîâ
|
|
SARGUMENT in varchar2, -- Êîä àðãóìåíòà
|
|
NREQUIRED in number := 0 -- Ôëàã âûäà÷è ñîîáùåíèÿ îá îøèáêå â ñëó÷àå îòñóòñòâèÿ çíà÷åíèÿ (0 - íå âûäàâàòü, 1 - âûäàâàòü)
|
|
) return TARGUMENT -- Íàéäåííûé àðãóìåíò
|
|
is
|
|
begin
|
|
/* Åñëè äàííûå â êîëëåêöèè åñòü */
|
|
if ((ARGUMENTS is not null) and (ARGUMENTS.COUNT > 0)) then
|
|
/* Îáõîäèì å¸ */
|
|
for I in ARGUMENTS.FIRST .. ARGUMENTS.LAST
|
|
loop
|
|
/* Åñëè âñòðåòèëñÿ íóæíûé àðãóìåíò */
|
|
if (ARGUMENTS(I).SNAME = SARGUMENT) then
|
|
/* Âåðí¸ì åãî */
|
|
return ARGUMENTS(I);
|
|
end if;
|
|
end loop;
|
|
end if;
|
|
/* Åñëè ìû çäåñü - àðãóìåíò íå íàøåëñÿ, áóäåì âûäàâàòü ñîîáùåíèå îá îøèáêå åñëè îí áûë îáÿçàòåëüíûì */
|
|
if (NREQUIRED = 1) then
|
|
P_EXCEPTION(0, 'Íå çàäàí îáÿçàòåëüíûé àðãóìåíò "%s".', SARGUMENT);
|
|
else
|
|
/* Îí íå îáÿçàòåëüíûé - âåðí¸ì îòñóòñòâèå äàííûõ */
|
|
return null;
|
|
end if;
|
|
end TARGUMENTS_GET;
|
|
|
|
/* Ñ÷èòûâàíèå çíà÷åíèÿ àðãóìåíòà èç êîëëåêöèè (ñòðîêà) */
|
|
function TARGUMENTS_SVAL_GET
|
|
(
|
|
ARGUMENTS in TARGUMENTS, -- Êîëëåêöèÿ àðãóìåíòîâ
|
|
SARGUMENT in varchar2, -- Êîä àðãóìåíòà
|
|
NREQUIRED in number := 0 -- Ôëàã âûäà÷è ñîîáùåíèÿ îá îøèáêå â ñëó÷àå îòñóòñòâèÿ çíà÷åíèÿ (0 - íå âûäàâàòü, 1 - âûäàâàòü)
|
|
) return varchar2 -- Çíà÷åíèå àðãóìåíòà
|
|
is
|
|
begin
|
|
/* Ñ÷èòàåì è âåðí¸ì çíà÷åíèå */
|
|
return TARGUMENTS_GET(ARGUMENTS => ARGUMENTS, SARGUMENT => SARGUMENT, NREQUIRED => NREQUIRED).SVALUE;
|
|
end TARGUMENTS_SVAL_GET;
|
|
|
|
/* Ñ÷èòûâàíèå çíà÷åíèÿ ïàðàìåòðà èç çàïðîñà (÷èñëî) */
|
|
function TARGUMENTS_NVAL_GET
|
|
(
|
|
ARGUMENTS in TARGUMENTS, -- Êîëëåêöèÿ àðãóìåíòîâ
|
|
SARGUMENT in varchar2, -- Êîä àðãóìåíòà
|
|
NREQUIRED in number := 0 -- Ôëàã âûäà÷è ñîîáùåíèÿ îá îøèáêå â ñëó÷àå îòñóòñòâèÿ çíà÷åíèÿ (0 - íå âûäàâàòü, 1 - âûäàâàòü)
|
|
) return number -- Çíà÷åíèå àðãóìåíòà
|
|
is
|
|
begin
|
|
/* Ñ÷èòàåì è âåðí¸ì çíà÷åíèå */
|
|
return TARGUMENTS_GET(ARGUMENTS => ARGUMENTS, SARGUMENT => SARGUMENT, NREQUIRED => NREQUIRED).NVALUE;
|
|
end TARGUMENTS_NVAL_GET;
|
|
|
|
/* Ñ÷èòûâàíèå çíà÷åíèÿ ïàðàìåòðà èç çàïðîñà (äàòà) */
|
|
function TARGUMENTS_DVAL_GET
|
|
(
|
|
ARGUMENTS in TARGUMENTS, -- Êîëëåêöèÿ àðãóìåíòîâ
|
|
SARGUMENT in varchar2, -- Êîä àðãóìåíòà
|
|
NREQUIRED in number := 0 -- Ôëàã âûäà÷è ñîîáùåíèÿ îá îøèáêå â ñëó÷àå îòñóòñòâèÿ çíà÷åíèÿ (0 - íå âûäàâàòü, 1 - âûäàâàòü)
|
|
) return date -- Çíà÷åíèå àðãóìåíòà
|
|
is
|
|
begin
|
|
/* Ñ÷èòàåì è âåðí¸ì çíà÷åíèå */
|
|
return TARGUMENTS_GET(ARGUMENTS => ARGUMENTS, SARGUMENT => SARGUMENT, NREQUIRED => NREQUIRED).DVALUE;
|
|
end TARGUMENTS_DVAL_GET;
|
|
|
|
/* Ñ÷èòûâàíèå çíà÷åíèÿ ïàðàìåòðà èç çàïðîñà (òåêñò) */
|
|
function TARGUMENTS_CVAL_GET
|
|
(
|
|
ARGUMENTS in TARGUMENTS, -- Êîëëåêöèÿ àðãóìåíòîâ
|
|
SARGUMENT in varchar2, -- Êîä àðãóìåíòà
|
|
NREQUIRED in number := 0 -- Ôëàã âûäà÷è ñîîáùåíèÿ îá îøèáêå â ñëó÷àå îòñóòñòâèÿ çíà÷åíèÿ (0 - íå âûäàâàòü, 1 - âûäàâàòü)
|
|
) return clob -- Çíà÷åíèå àðãóìåíòà
|
|
is
|
|
begin
|
|
/* Ñ÷èòàåì è âåðí¸ì çíà÷åíèå */
|
|
return TARGUMENTS_GET(ARGUMENTS => ARGUMENTS, SARGUMENT => SARGUMENT, NREQUIRED => NREQUIRED).CVALUE;
|
|
end TARGUMENTS_CVAL_GET;
|
|
|
|
/* Ïîëó÷åíèå êîðíåâîãî ýëåìåíòà òåëà çàïðîñà */
|
|
function RQ_ROOT_GET
|
|
(
|
|
CRQ in clob -- Çàïðîñ
|
|
) return PKG_XPATH.TNODE -- Êîðíåâîé ýëåìåíò ïåðâîé âåòêè òåëà äîêóìåíòà
|
|
is
|
|
begin
|
|
/* Âîçâðàùàåì êîðíåâîé ýëåìåíò äîêóìåíòà */
|
|
return PKG_XPATH.ROOT_NODE(RDOCUMENT => PKG_XPATH.PARSE_FROM_CLOB(LCXML => CRQ));
|
|
end RQ_ROOT_GET;
|
|
|
|
/* Ïîëó÷åíèå ïóòè ê çàïðîñó */
|
|
function RQ_PATH_GET
|
|
return varchar2 -- Ïóòü ê çàïðîñó
|
|
is
|
|
begin
|
|
return '/' || SRQ_TAG_XREQUEST;
|
|
end RQ_PATH_GET;
|
|
|
|
/* Ïîëó÷åíèå ïóòè ê ýëåìåíòó äåéñòâèÿ çàïðîñà */
|
|
function RQ_ACTION_PATH_GET
|
|
return varchar2 -- Ïóòü ê ýëåìåíòó äåéñòâèÿ çàïðîñà
|
|
is
|
|
begin
|
|
return RQ_PATH_GET() || '/' || SRQ_TAG_SACTION;
|
|
end RQ_ACTION_PATH_GET;
|
|
|
|
/* Ïîëó÷åíèå êîäà äåéñòâèÿ çàïðîñà */
|
|
function RQ_ACTION_GET
|
|
(
|
|
XRQ_ROOT in PKG_XPATH.TNODE := null, -- Êîðíåâàÿ âåòêà çàïðîñà
|
|
NREQUIRED in number := 0 -- Ôëàã âûäà÷è ñîîáùåíèÿ îá îøèáêå â ñëó÷àå îòñóòñòâèÿ çíà÷åíèÿ (0 - íå âûäàâàòü, 1 - âûäàâàòü)
|
|
) return varchar2 -- Êîä äåéñòâèÿ çàïðîñà
|
|
is
|
|
begin
|
|
/* Âåðíåì çíà÷åíèå ýëåìåíòà òåëà ñ êîäîì äåéñòâèÿ */
|
|
return NODE_SVAL_GET(XROOT => XRQ_ROOT,
|
|
SPATH => RQ_ACTION_PATH_GET(),
|
|
NREQUIRED => NREQUIRED,
|
|
SMESSAGE_OBJECT => 'Êîä äåéñòâèÿ');
|
|
end RQ_ACTION_GET;
|
|
|
|
/* Ïîëó÷åíèå ïóòè ê ïàðàìåòðàì çàïðîñà */
|
|
function RQ_PAYLOAD_PATH_GET
|
|
return varchar2 -- Ïóòü ê ïàðàìåòðàì çàïðîñà
|
|
is
|
|
begin
|
|
/* Âåðíåì çíà÷åíèå */
|
|
return RQ_PATH_GET() || '/' || SRQ_TAG_XPAYLOAD;
|
|
end RQ_PAYLOAD_PATH_GET;
|
|
|
|
/* Ïîëó÷åíèå ïóòè ê ýëêìåíòó ïàðàìåòðîâ çàïðîñà */
|
|
function RQ_PAYLOAD_ITEM_PATH_GET
|
|
(
|
|
SITEM_TAG in varchar2 -- Òýã ýëåìåíòà
|
|
)
|
|
return varchar2 -- Ïóòü ê ýëåìåíòó ïàðàìåòðîâ çàïðîñà
|
|
is
|
|
begin
|
|
/* Âåðíåì çíà÷åíèå */
|
|
return RQ_PAYLOAD_PATH_GET() || '/' || SITEM_TAG;
|
|
end RQ_PAYLOAD_ITEM_PATH_GET;
|
|
|
|
/* Ñ÷èòûâàíèå íàèìåíîâàíèÿ èñïîëíÿåìîãî õðàíèìîãî îáúåêòà èç çàïðîñà */
|
|
function RQ_PAYLOAD_STORED_GET
|
|
(
|
|
XRQ_ROOT in PKG_XPATH.TNODE := null, -- Êîðíåâàÿ âåòêà çàïðîñà
|
|
NREQUIRED in number := 0 -- Ôëàã âûäà÷è ñîîáùåíèÿ îá îøèáêå â ñëó÷àå îòñóòñòâèÿ çíà÷åíèÿ (0 - íå âûäàâàòü, 1 - âûäàâàòü)
|
|
) return varchar2 -- Íàèìåíîâàíèå èñïîëíÿåìîãî õðàíèìîãî îáúåêòà èç çàïðîñà
|
|
is
|
|
begin
|
|
/* Âåðíåì çíà÷åíèå ýëåìåíòà òåëà ñ íàèìåíîâàíèåì õðàíèìîãî îáúåêòà */
|
|
return NODE_SVAL_GET(XROOT => XRQ_ROOT,
|
|
SPATH => RQ_PAYLOAD_ITEM_PATH_GET(SITEM_TAG => SRQ_TAG_SSTORED),
|
|
NREQUIRED => NREQUIRED,
|
|
SMESSAGE_OBJECT => 'Íàèìåíîâàíèå ïðîöåäóðû/ôóíêöèè');
|
|
end RQ_PAYLOAD_STORED_GET;
|
|
|
|
/* Ïðîâåðêà èñïîëíÿåìîãî õðàíèìîãî îáúåêòà èç çàïðîñà */
|
|
procedure RQ_PAYLOAD_STORED_CHECK
|
|
(
|
|
XRQ_ROOT in PKG_XPATH.TNODE, -- Êîðíåâàÿ âåòêà çàïðîñà
|
|
SSTORED in varchar2 := null -- Íàèìåíîâàíèå ïðîâåðÿåìîãî õðàíèìîãî îáúåêòà (null - àâòîìàòè÷åñêîå ñ÷èòûâàíèå èç çàïðîñà)
|
|
)
|
|
is
|
|
SSTORED_ PKG_STD.TSTRING; -- Áóôåð äëÿ íàèìåíîâàíèÿ ïðîâåðÿåìîãî õðàíèìîãî îáúåêòà
|
|
RSTORED PKG_OBJECT_DESC.TSTORED; -- Îïèñàíèå õðàíèìîãî îáúåêòà èç ÁÄ
|
|
SPROCEDURE PKG_STD.TSTRING; -- Áóôåð äëÿ íàèìåíîâàíèÿ õðàíèìîé ïðîöåäóðû
|
|
SPACKAGE PKG_STD.TSTRING; -- Áóôåð äëÿ íàèìåíîâàíèÿ ïàêåòà, ñîäåðæàùåãî õðàíèìûé îáúåêò
|
|
RPACKAGE PKG_OBJECT_DESC.TPACKAGE; -- Îïèñàíèå ïàêåòà, ñîäåðæàùåãî õðàíèìûé îáúåêò
|
|
begin
|
|
/* Ñ÷èòàåì íàèìåíîâàíèå îáúåêòà èç çàïðîñà èëè èñïîëüçóåì ïåðåäàííîå â ïàðàìåòðàõ */
|
|
if (SSTORED is not null) then
|
|
SSTORED_ := SSTORED;
|
|
else
|
|
SSTORED_ := RQ_PAYLOAD_STORED_GET(XRQ_ROOT => XRQ_ROOT, NREQUIRED => 1);
|
|
end if;
|
|
/* Ïðîâåðèì, ÷òî ýòî ïðîöåäóðà èëè ôóíêöèÿ è îíà âîîáùå ñóùåñòâóåò */
|
|
if (PKG_OBJECT_DESC.EXISTS_STORED(SSTORED_NAME => SSTORED_) = 0) then
|
|
P_EXCEPTION(0,
|
|
'Õðàíèìàÿ ïðîöåäóðà/ôóíêöèÿ "' || SSTORED_ || '" íå îïðåäåëåíà.');
|
|
else
|
|
/* Ïðîâåðèì, ÷òî â èìåíè íåò ññûëêè íà ïàêåò */
|
|
PKG_EXS.UTL_STORED_PARSE_LINK(SSTORED => SSTORED_, SPROCEDURE => SPROCEDURE, SPACKAGE => SPACKAGE);
|
|
/* Åñëè â èìåíè åñòü ññûëêà íà ïàêåò - ñíà÷àëà ïðîâåðèì åãî ñîñòîÿíèå */
|
|
if (SPACKAGE is not null) then
|
|
RPACKAGE := PKG_OBJECT_DESC.DESC_PACKAGE(SPACKAGE_NAME => SPACKAGE, BRAISE_ERROR => false);
|
|
end if;
|
|
/* Åñëè åñòü ññûëêà íà ïàêåò, èëè îí íå âàëèäåí - ýòî îøèáêà */
|
|
if ((SPACKAGE is not null) and (RPACKAGE.STATUS <> SDB_OBJECT_STATE_VALID)) then
|
|
P_EXCEPTION(0,
|
|
'Ïàêåò "' || SPACKAGE ||
|
|
'", ñîäåðæàùèé õðàíèìóþ ïðîöåäóðó/ôóíêöèþ, íåâàëèäåí. Îáðàùåíèå ê îáúåêòó íåâîçìîæíî.');
|
|
else
|
|
/* Íåò ññûëêè íà ïàêåò èëè îí âàëèäåí - ïðîâåðÿåì ãëóáæå, ïîëó÷èì îïèñàíèå îáúåêòà èç ÁÄ */
|
|
RSTORED := PKG_OBJECT_DESC.DESC_STORED(SSTORED_NAME => SSTORED_, BRAISE_ERROR => false);
|
|
/* Ïðîâåðèì, ÷òî âàëèäíà */
|
|
if (RSTORED.STATUS <> SDB_OBJECT_STATE_VALID) then
|
|
P_EXCEPTION(0,
|
|
'Õðàíèìàÿ ïðîöåäóðà/ôóíêöèÿ "' || SSTORED_ || '" íåâàëèäíà. Îáðàùåíèå ê îáúåêòó íåâîçìîæíî.');
|
|
else
|
|
/* Ïðîâåðèì, ÷òî ýòî êëèåíòñêèé îáúåêò */
|
|
if (PKG_OBJECT_DESC.EXISTS_PRIV_EXECUTE(SSTORED_NAME => COALESCE(RSTORED.PACKAGE_NAME, SSTORED_)) = 0) then
|
|
P_EXCEPTION(0,
|
|
'Õðàíèìàÿ ïðîöåäóðà/ôóíêöèÿ "' || SSTORED_ ||
|
|
'" íå ÿâëÿåòñÿ êëèåíòñêîé. Îáðàùåíèå ê îáúåêòó íåâîçìîæíî.');
|
|
end if;
|
|
end if;
|
|
end if;
|
|
end if;
|
|
end RQ_PAYLOAD_STORED_CHECK;
|
|
|
|
/* Ñ÷èòûâàíèå ñïèñêà àðãóìåíòîâ èç çàïðîñà */
|
|
function RQ_PAYLOAD_ARGUMENTS_GET
|
|
(
|
|
XRQ_ROOT in PKG_XPATH.TNODE, -- Êîðíåâàÿ âåòêà çàïðîñà
|
|
NREQUIRED in number := 0 -- Ôëàã âûäà÷è ñîîáùåíèÿ îá îøèáêå â ñëó÷àå îòñóòñòâèÿ çíà÷åíèÿ (0 - íå âûäàâàòü, 1 - âûäàâàòü)
|
|
) return TARGUMENTS -- Êîëëåêöèÿ àðãóìåíòîâ èç çàïðîñà
|
|
is
|
|
RES TARGUMENTS; -- Ðåçóëüòàò ðàáîòû
|
|
SRQ_ARGUMENTS_PATH PKG_STD.TSTRING; -- Ïîëíûé ïóòü äî àðãóìåíòîâ âûáîðêè â çàïðîñå
|
|
XRQ_ARGUMENTS PKG_XPATH.TNODES; -- Êîëëåêöèÿ ýëåìåíòîâ äîêóìåíòà çàïðîñà ñ àðãóìåíòàìè
|
|
XRQ_ARGUMENT PKG_XPATH.TNODE; -- Ýëåìåíò äîêóìåíòà çàïðîñà ñ àðãóìåíòîâ
|
|
begin
|
|
/* Èíèöèàëèçèðóåì ðåçóëüòàò */
|
|
RES := TARGUMENTS();
|
|
/* Ñôîðìèðóåì ïîëíûé ïóòü äî àðãóìåíòîâ â âûáîðêå */
|
|
SRQ_ARGUMENTS_PATH := RQ_PAYLOAD_ITEM_PATH_GET(SITEM_TAG => SRQ_TAG_XARGUMENTS) || '/' || SRQ_TAG_XARGUMENT;
|
|
/* Ñ÷èòàåì êîëëåêöèþ àðãóìåíòîâ èç äîêóìåíòà */
|
|
XRQ_ARGUMENTS := PKG_XPATH.LIST_NODES(RPARENT_NODE => XRQ_ROOT, SPATTERN => SRQ_ARGUMENTS_PATH);
|
|
/* Îáõîäèì êîëëåêöèþ àðãóìåíòîâ èç äîêóìåíòà */
|
|
for I in 1 .. PKG_XPATH.COUNT_NODES(RNODES => XRQ_ARGUMENTS)
|
|
loop
|
|
/* Áåðåì î÷åðåäíîé àðãóìåíò */
|
|
XRQ_ARGUMENT := PKG_XPATH.ITEM_NODE(RNODES => XRQ_ARGUMENTS, INUMBER => I);
|
|
/* Äîáàâëÿåì åãî â âûõîäíóþ êîëëåêöèþ */
|
|
RES.EXTEND();
|
|
RES(RES.LAST).SNAME := NODE_SVAL_GET(XROOT => XRQ_ARGUMENT, SPATH => SRQ_TAG_SNAME);
|
|
RES(RES.LAST).SDATA_TYPE := NODE_SVAL_GET(XROOT => XRQ_ARGUMENT, SPATH => SRQ_TAG_SDATA_TYPE);
|
|
/* Ïðîâåðèì êîððåêòíîñòü äàííûõ - íàèìåíîâàíèå */
|
|
if (RES(RES.LAST).SNAME is null) then
|
|
P_EXCEPTION(0,
|
|
'Äëÿ àðãóìåíòà íå çàäàíî íàèìåíîâàíèå (%s).',
|
|
SRQ_ARGUMENTS_PATH || '/' || SRQ_TAG_SNAME);
|
|
end if;
|
|
/* Ïðîâåðèì êîððåêòíîñòü äàííûõ - òèï äàííûõ */
|
|
if (RES(RES.LAST).SDATA_TYPE is null) then
|
|
P_EXCEPTION(0,
|
|
'Äëÿ àðãóìåíòà "%s" íå çàäàí òèï äàííûõ (%s).',
|
|
RES(RES.LAST).SNAME,
|
|
SRQ_ARGUMENTS_PATH || '/' || SRQ_TAG_SDATA_TYPE);
|
|
end if;
|
|
/* Ñ÷èòàåì çíà÷åíèå â çàâèñèìîñòè îò òèïà äàííûõ */
|
|
case
|
|
/* Ñòðîêà */
|
|
when (RES(RES.LAST).SDATA_TYPE = SDATA_TYPE_STR) then
|
|
RES(RES.LAST).SVALUE := NODE_SVAL_GET(XROOT => XRQ_ARGUMENT, SPATH => SRQ_TAG_VALUE);
|
|
/* ×èñëî */
|
|
when (RES(RES.LAST).SDATA_TYPE = SDATA_TYPE_NUMB) then
|
|
RES(RES.LAST).NVALUE := NODE_NVAL_GET(XROOT => XRQ_ARGUMENT, SPATH => SRQ_TAG_VALUE);
|
|
/* Äàòà */
|
|
when (RES(RES.LAST).SDATA_TYPE = SDATA_TYPE_DATE) then
|
|
RES(RES.LAST).DVALUE := NODE_DVAL_GET(XROOT => XRQ_ARGUMENT, SPATH => SRQ_TAG_VALUE);
|
|
/* Òåêñò */
|
|
when (RES(RES.LAST).SDATA_TYPE = SDATA_TYPE_CLOB) then
|
|
RES(RES.LAST).CVALUE := NODE_CVAL_GET(XROOT => XRQ_ARGUMENT, SPATH => SRQ_TAG_VALUE);
|
|
/* Íåïîääåðæèâàåìûé òèï äàííûõ */
|
|
else
|
|
P_EXCEPTION(0,
|
|
'Óêàçàííûé äëÿ àðãóìåíòà "%s" òèï äàííûõ "%s" íå ïîääåðæèâàåòñÿ (%s).',
|
|
RES(RES.LAST).SNAME,
|
|
RES(RES.LAST).SDATA_TYPE,
|
|
SRQ_ARGUMENTS_PATH || '/' || SRQ_TAG_SDATA_TYPE);
|
|
end case;
|
|
end loop;
|
|
/* Ïðîâåðêà îáÿçàòåëüíîñòè */
|
|
if ((RES.COUNT = 0) and (NREQUIRED = 1)) then
|
|
P_EXCEPTION(0, 'Íå óêàçàíû àðãóìåíòû (' || SRQ_ARGUMENTS_PATH || ').');
|
|
end if;
|
|
/* Âîçâðàùàåì ðåçóëüòàò */
|
|
return RES;
|
|
end RQ_PAYLOAD_ARGUMENTS_GET;
|
|
|
|
/* Èñïîëíåíèå õðàíèìîé ïðîöåäóðû */
|
|
procedure EXEC_STORED
|
|
(
|
|
XRQ_ROOT in PKG_XPATH.TNODE, -- Êîðíåâîé ýëåìåíò òåëà äîêóìåíòà çàïðîñà
|
|
COUT out clob -- Îòâåò íà çàïðîñ
|
|
)
|
|
is
|
|
SRQ_STORED PKG_STD.TSTRING; -- Íàèìåíîâàíèå èñïîëíÿåìîãî õðàíèìîãî îáúåêòà èç çàïðîñà
|
|
SRQ_RESP_ARG PKG_STD.TSTRING; -- Íàèìåíîâàíèå âûõîäíîãî àðãóìåíòà õðàíèìîãî îáúåêòà èç çàïðîñà äëÿ ôîðìèðîâàíèÿ òåëà îòâåòà
|
|
RQ_ARGUMENTS TARGUMENTS; -- Êîëëåêöèÿ àðãóìåíòîâ õðàíèìîãî îáúåêòà èç çàïðîñà
|
|
ARGS PKG_OBJECT_DESC.TARGUMENTS; -- Êîëëåêöèÿ ôîðìàëüíûõ ïàðàìåòðîâ õðàíèìîãî îáúåêòà
|
|
RARG PKG_OBJECT_DESC.TARGUMENT; -- Ôîðìàëüíûé ïàðàìåòð õðàíèìîãî îáúåêòà
|
|
ARGS_VALS PKG_CONTPRMLOC.TCONTAINER; -- Êîíòåéíåð äëÿ ôàêòè÷åñêèõ ïàðàìåòðîâ õðàíèìîãî îáúåêòà
|
|
RARG_VAL PKG_CONTAINER.TPARAM; -- Ôàêòè÷åñêèé ïàðàìåòð õðàíèìîãî îáúåêòà
|
|
SARG_NAME PKG_STD.TSTRING; -- Íàèìåíîâàíèå òåêóùåãî îáðàáàòûâàåìîãî ôàêòè÷åñêîãî ïàðàìåòðà õðàíèìîãî îáúåêòà
|
|
XRESP integer; -- Äîêóìåíò äëÿ îòâåòà
|
|
XRESP_OUT_ARGUMENTS PKG_XMAKE.TNODE; -- Ýëåìåíò äëÿ êîëëåêöèè âûõîäíûõ ïàðàìåòðîâ õðàíèìîãî îáúåêòà
|
|
RRESP_ARGUMENT_VALUE PKG_XMAKE.TVALUE; -- Çíà÷åíèå âûõîäíîãî ïàðàìåòðà õðàíèìîãî îáúåêòà
|
|
BRESP_ARG_FOUND boolean := false; -- Ôëàã ïðèñóòñòâèÿ â ñîñòàâå âûõîäíûõ àðãóìåíòîâ àðãóìåíòà ñ òèïîì CLOB è èìåíåì, óêàçàííûì â ïàðàìåòðå çàïðîñà SRESP_ARG
|
|
begin
|
|
/* Ñîçäà¸ì äîêóìåíò äëÿ îòâåòà */
|
|
XRESP := PKG_XMAKE.OPEN_CURSOR();
|
|
/* Ïðîâåðèì õðàíèìûé îáúåêò â çàïðîñå */
|
|
RQ_PAYLOAD_STORED_CHECK(XRQ_ROOT => XRQ_ROOT);
|
|
/* Ñ÷èòûâàåì íàèìåíîâàíèå õðàíèìîãî îáúåêòà èç çàïðîñà */
|
|
SRQ_STORED := RQ_PAYLOAD_STORED_GET(XRQ_ROOT => XRQ_ROOT, NREQUIRED => 1);
|
|
/* Ñ÷èòûâàåì íàèìåíîâàíèå âûõîäíîãî àðãóìåíòà õðàíèìîãî îáúåêòà èç çàïðîñà äëÿ ôîðìèðîâàíèÿ òåëà îòâåòà */
|
|
SRQ_RESP_ARG := NODE_SVAL_GET(XROOT => XRQ_ROOT,
|
|
SPATH => RQ_PAYLOAD_ITEM_PATH_GET(SITEM_TAG => SRQ_TAG_SRESP_ARG),
|
|
NREQUIRED => 0,
|
|
SMESSAGE_OBJECT => 'Íàèìåíîâàíèå âûõîäíîãî àðãóìåíòà äëÿ ôîðìèðîâàíèÿ òåëà îòâåòà');
|
|
/* Ñ÷èòàåì ñïèñîê àðãóìåíòîâ èç çàïðîñà */
|
|
RQ_ARGUMENTS := RQ_PAYLOAD_ARGUMENTS_GET(XRQ_ROOT => XRQ_ROOT);
|
|
/* Ñ÷èòûâàåì îïèñàíèå ïàðàìåòðîâ õðàíèìîãî îáúåêòà */
|
|
ARGS := PKG_OBJECT_DESC.DESC_ARGUMENTS(SSTORED_NAME => SRQ_STORED, BRAISE_ERROR => true);
|
|
/* Îáõîäèì âõîäíûå ïàðàìåòðû è ôîðìèðóåì êîëëåêöèþ çíà÷åíèé */
|
|
for I in 1 .. PKG_OBJECT_DESC.COUNT_ARGUMENTS(RARGUMENTS => ARGS)
|
|
loop
|
|
/* Ñ÷èòûâàåì î÷åðåäíîé ïàðàìåòð */
|
|
RARG := PKG_OBJECT_DESC.FETCH_ARGUMENT(RARGUMENTS => ARGS, IINDEX => I);
|
|
/* Åñëè ýòî âõîäíîé ïàðàìåòð */
|
|
if (RARG.IN_OUT in (PKG_STD.PARAM_TYPE_IN, PKG_STD.PARAM_TYPE_IN_OUT)) then
|
|
/* Äîáàâèì åãî çíà÷åíèå â êîëëåêöèþ ôàêòè÷åñêèõ ïàðàìåòðîâ */
|
|
case RARG.DATA_TYPE
|
|
/* Ñòðîêà */
|
|
when PKG_STD.DATA_TYPE_STR then
|
|
PKG_CONTPRMLOC.APPENDS(RCONTAINER => ARGS_VALS,
|
|
SNAME => RARG.ARGUMENT_NAME,
|
|
SVALUE => TARGUMENTS_SVAL_GET(ARGUMENTS => RQ_ARGUMENTS,
|
|
SARGUMENT => RARG.ARGUMENT_NAME),
|
|
NIN_OUT => RARG.IN_OUT);
|
|
/* ×èñëî */
|
|
when PKG_STD.DATA_TYPE_NUM then
|
|
PKG_CONTPRMLOC.APPENDN(RCONTAINER => ARGS_VALS,
|
|
SNAME => RARG.ARGUMENT_NAME,
|
|
NVALUE => TARGUMENTS_NVAL_GET(ARGUMENTS => RQ_ARGUMENTS,
|
|
SARGUMENT => RARG.ARGUMENT_NAME),
|
|
NIN_OUT => RARG.IN_OUT);
|
|
/* Äàòà */
|
|
when PKG_STD.DATA_TYPE_DATE then
|
|
PKG_CONTPRMLOC.APPENDD(RCONTAINER => ARGS_VALS,
|
|
SNAME => RARG.ARGUMENT_NAME,
|
|
DVALUE => TARGUMENTS_DVAL_GET(ARGUMENTS => RQ_ARGUMENTS,
|
|
SARGUMENT => RARG.ARGUMENT_NAME),
|
|
NIN_OUT => RARG.IN_OUT);
|
|
/* Òåêñò */
|
|
when PKG_STD.DATA_TYPE_CLOB then
|
|
PKG_CONTPRMLOC.APPENDLC(RCONTAINER => ARGS_VALS,
|
|
SNAME => RARG.ARGUMENT_NAME,
|
|
LCVALUE => TARGUMENTS_CVAL_GET(ARGUMENTS => RQ_ARGUMENTS,
|
|
SARGUMENT => RARG.ARGUMENT_NAME),
|
|
NIN_OUT => RARG.IN_OUT);
|
|
/* Íåèçâåñòíûé òèï äàííûõ */
|
|
else
|
|
P_EXCEPTION(0,
|
|
'Òèï äàííûõ (%s) âõîäíîãî ïàðàìåòðà "%s" íå ïîääåðæèâàåòñÿ.',
|
|
RARG.DB_DATA_TYPE,
|
|
RARG.ARGUMENT_NAME);
|
|
end case;
|
|
end if;
|
|
end loop;
|
|
/* Èñïîëíÿåì ïðîöåäóðó */
|
|
PKG_SQL_CALL.EXECUTE_STORED(SSTORED_NAME => SRQ_STORED, RPARAM_CONTAINER => ARGS_VALS);
|
|
/* Îáõîäèì âûõîäíûå ïàðàìåòðû è ñîáèðàåì èõ â îòâåò */
|
|
SARG_NAME := PKG_CONTPRMLOC.FIRST_(RCONTAINER => ARGS_VALS);
|
|
while (SARG_NAME is not null)
|
|
loop
|
|
/* Ñ÷èòûâàåì î÷åðåäíîé ïàðàìåòð */
|
|
RARG_VAL := PKG_CONTPRMLOC.GET(RCONTAINER => ARGS_VALS, SNAME => SARG_NAME);
|
|
/* Åñëè ýòî âûõîäíîé ïàðàìåòð */
|
|
if (RARG_VAL.IN_OUT in (PKG_STD.PARAM_TYPE_IN_OUT, PKG_STD.PARAM_TYPE_OUT)) then
|
|
/* Ñôîðìèðóåì äëÿ íåãî çíà÷åíèå â çàâèñèìîñòè îò åãî òèïà */
|
|
case RARG_VAL.DATA_TYPE
|
|
/* Ñòðîêà */
|
|
when PKG_STD.DATA_TYPE_STR then
|
|
RRESP_ARGUMENT_VALUE := PKG_XMAKE.VALUE(ICURSOR => XRESP,
|
|
SVALUE => PKG_CONTPRMLOC.GETS(RCONTAINER => ARGS_VALS,
|
|
SNAME => RARG_VAL.NAME));
|
|
/* ×èñëî */
|
|
when PKG_STD.DATA_TYPE_NUM then
|
|
RRESP_ARGUMENT_VALUE := PKG_XMAKE.VALUE(ICURSOR => XRESP,
|
|
NVALUE => PKG_CONTPRMLOC.GETN(RCONTAINER => ARGS_VALS,
|
|
SNAME => RARG_VAL.NAME));
|
|
/* Äàòà */
|
|
when PKG_STD.DATA_TYPE_DATE then
|
|
RRESP_ARGUMENT_VALUE := PKG_XMAKE.VALUE(ICURSOR => XRESP,
|
|
DVALUE => PKG_CONTPRMLOC.GETD(RCONTAINER => ARGS_VALS,
|
|
SNAME => RARG_VAL.NAME));
|
|
/* Òåêñò */
|
|
when PKG_STD.DATA_TYPE_CLOB then
|
|
RRESP_ARGUMENT_VALUE := PKG_XMAKE.VALUE(ICURSOR => XRESP,
|
|
LCVALUE => PKG_CONTPRMLOC.GETLC(RCONTAINER => ARGS_VALS,
|
|
SNAME => RARG_VAL.NAME));
|
|
if ((SRQ_RESP_ARG is not null) and (RARG_VAL.NAME = SRQ_RESP_ARG)) then
|
|
COUT := PKG_CONTPRMLOC.GETLC(RCONTAINER => ARGS_VALS, SNAME => RARG_VAL.NAME);
|
|
BRESP_ARG_FOUND := true;
|
|
exit;
|
|
end if;
|
|
/* Íåèçâåñòíûé òèï äàííûõ */
|
|
else
|
|
P_EXCEPTION(0,
|
|
'Òèï äàííûõ (%s) âûõîäíîãî ïàðàìåòðà "%s" íå ïîääåðæèâàåòñÿ.',
|
|
RARG.DB_DATA_TYPE,
|
|
RARG.ARGUMENT_NAME);
|
|
end case;
|
|
/* Äîáàâèì âåòêó âûõîäíîãî ïàðàìåòðà â âûõîäíóþ êîëëåêöèþ */
|
|
XRESP_OUT_ARGUMENTS := PKG_XMAKE.CONCAT(ICURSOR => XRESP,
|
|
RNODE00 => XRESP_OUT_ARGUMENTS,
|
|
RNODE01 => PKG_XMAKE.ELEMENT(ICURSOR => XRESP,
|
|
SNAME => SRESP_TAG_XOUT_ARGUMENTS,
|
|
RNODE00 => PKG_XMAKE.ELEMENT(ICURSOR => XRESP,
|
|
SNAME => SRESP_TAG_SNAME,
|
|
RVALUE00 => PKG_XMAKE.VALUE(ICURSOR => XRESP,
|
|
SVALUE => RARG_VAL.NAME)),
|
|
RNODE01 => PKG_XMAKE.ELEMENT(ICURSOR => XRESP,
|
|
SNAME => SRESP_TAG_VALUE,
|
|
RVALUE00 => RRESP_ARGUMENT_VALUE),
|
|
RNODE02 => PKG_XMAKE.ELEMENT(ICURSOR => XRESP,
|
|
SNAME => SRESP_TAG_SDATA_TYPE,
|
|
RVALUE00 => PKG_XMAKE.VALUE(ICURSOR => XRESP,
|
|
SVALUE => STD_DATA_TYPE_TO_STR(NSTD_DATA_TYPE => RARG_VAL.DATA_TYPE)))));
|
|
end if;
|
|
/* Ñ÷èòûâàåì íàèìåíîâàíèå ñëåäóþùåãî ïàðàìåòðà */
|
|
SARG_NAME := PKG_CONTPRMLOC.NEXT_(RCONTAINER => ARGS_VALS, SNAME => SARG_NAME);
|
|
end loop;
|
|
/* Ïðîâåðèì, ÷òî áûë íàéäåí îïöèîíàëüíûé àðãóìåíò äëÿ ôîðìèðîâàíèÿ ïîëíîãî îòâåòà */
|
|
if ((SRQ_RESP_ARG is not null) and (not BRESP_ARG_FOUND)) then
|
|
P_EXCEPTION(0,
|
|
'Â ñîñòàâå âûõîäíûõ ïàðàìåòðîâ "%s" îòñóñòâóåò àðãóìåíò "%s" òèïà "CLOB".',
|
|
SRQ_STORED,
|
|
SRQ_RESP_ARG);
|
|
end if;
|
|
/* Ñîáèðàåì îòâåò (òîëüêî åñëè íå ôîðìèðîâàëè ïîëíûé îòâåò ÷åðåç àðãóìåíò äëÿ ôîðìèðîâàíèÿ ïîëíîãî îòâåòà) */
|
|
if (not BRESP_ARG_FOUND) then
|
|
COUT := PKG_XMAKE.SERIALIZE_TO_CLOB(ICURSOR => XRESP,
|
|
ITYPE => PKG_XMAKE.CONTENT_,
|
|
RNODE => PKG_XMAKE.ELEMENT(ICURSOR => XRESP,
|
|
SNAME => SRESP_TAG_XPAYLOAD,
|
|
RNODE00 => XRESP_OUT_ARGUMENTS));
|
|
end if;
|
|
/* Î÷èñòèì êîíòåéíåð ïàðàìåòðîâ */
|
|
PKG_CONTPRMLOC.PURGE(RCONTAINER => ARGS_VALS);
|
|
/* Îñâîáîæäàåì äîêóìåíò ðåçóëüòàòà */
|
|
PKG_XMAKE.CLOSE_CURSOR(ICURSOR => XRESP);
|
|
exception
|
|
when others then
|
|
/* Çàêðîåì êóðñîð è âåðíåì îøèáêó */
|
|
PKG_XMAKE.CLOSE_CURSOR(ICURSOR => XRESP);
|
|
/* Ïîêàæåì îøèáêó */
|
|
PKG_STATE.DIAGNOSTICS_STACKED();
|
|
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
|
|
end EXEC_STORED;
|
|
|
|
/* Áàçîâîå èñïîëíåíèå äåéñòâèé */
|
|
procedure PROCESS
|
|
(
|
|
CIN in clob, -- Âõîäíûå ïàðàìåòðû
|
|
COUT out clob -- Ðåçóëüòàò
|
|
)
|
|
is
|
|
XRQ_ROOT PKG_XPATH.TNODE; -- Êîðíåâîé ýëåìåíò òåëà äîêóìåíòà çàïðîñà
|
|
SRQ_ACTION PKG_STD.TSTRING; -- Êîä äåéñòâèÿ èç çàïðîñà
|
|
begin
|
|
PKG_TRACE.REGISTER(SDATA => 'P8PANELS', SDATA1 => CIN);
|
|
/* Ðàçáèðàåì çàïðîñ */
|
|
XRQ_ROOT := RQ_ROOT_GET(CRQ => CIN);
|
|
/* Ñ÷èòûâàåì êîä äåéñòâèÿ èç çàïðîñà */
|
|
SRQ_ACTION := RQ_ACTION_GET(XRQ_ROOT => XRQ_ROOT, NREQUIRED => 1);
|
|
/* Âûçûâàåì îáðàáîò÷èê â çàâèñèìîñòè îò êîäà äåéñòâèÿ */
|
|
case SRQ_ACTION
|
|
/* Èñïîëíåíèå õðàíèìîé ïðîöåäóðû */
|
|
when SRQ_ACTION_EXEC_STORED then
|
|
EXEC_STORED(XRQ_ROOT => XRQ_ROOT, COUT => COUT);
|
|
/* Íåèçâåñòíîå äåéñòâèå */
|
|
else
|
|
P_EXCEPTION(0, 'Äåéñòâèå "%s" íå ïîääåðæèâàåòñÿ.', SRQ_ACTION);
|
|
end case;
|
|
end PROCESS;
|
|
|
|
end PKG_P8PANELS_BASE;
|
|
/
|