P8-Panels/db/PKG_P8PANELS_BASE.pck
2023-09-24 22:25:19 +03:00

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;
/