БД - инициализация

This commit is contained in:
Mikhail Chechnev 2023-09-24 22:25:19 +03:00
parent c9b12981cf
commit fd5e29708f
6 changed files with 4965 additions and 0 deletions

27
db/PKG_P8PANELS.pck Normal file
View File

@ -0,0 +1,27 @@
create or replace package PKG_P8PANELS as
/* Èñïîëíåíèå äåéñòâèé êëèåíòñêèõ ïðèëîæåíèé */
procedure PROCESS
(
CIN in clob, -- Âõîäíûå ïàðàìåòðû
COUT out clob -- Ðåçóëüòàò
);
end PKG_P8PANELS;
/
create or replace package body PKG_P8PANELS as
/* Èñïîëíåíèå äåéñòâèé êëèåíòñêèõ ïðèëîæåíèé */
procedure PROCESS
(
CIN in clob, -- Âõîäíûå ïàðàìåòðû
COUT out clob -- Ðåçóëüòàò
)
is
begin
/* Áàçîâîå èñïîëíåíèå äåéñòâèÿ */
PKG_P8PANELS_BASE.PROCESS(CIN => CIN, COUT => COUT);
end PROCESS;
end PKG_P8PANELS;
/

814
db/PKG_P8PANELS_BASE.pck Normal file
View File

@ -0,0 +1,814 @@
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;
/

2827
db/PKG_P8PANELS_PROJECTS.pck Normal file

File diff suppressed because it is too large Load Diff

1131
db/PKG_P8PANELS_VISUAL.pck Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,143 @@
create or replace procedure UDO_P_P8PANELS_AGNLIST
(
NPAGE_NUMBER in number, -- Íîìåð ñòðàíèöû (èãíîðèðóåòñÿ ïðè NPAGE_SIZE=0)
NPAGE_SIZE in number, -- Êîëè÷åñòâî çàïèñåé íà ñòðàíèöå (0 - âñå)
CFILTERS in clob, -- Ôèëüòðû
CORDERS in clob, -- Ñîðòèðîâêè
NINCLUDE_DEF in number, -- Ïðèçíàê âêëþ÷åíèÿ îïèñàíèÿ êîëîíîê òàáëèöû â îòâåò
COUT out clob -- Ñåðèàëèçîâàííàÿ òàáëèöà äàííûõ
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Îðãàíèçàöèÿ ñåàíñà
NIDENT PKG_STD.TREF := GEN_IDENT(); -- Èäåíòèôèêàòîð îòáîðà
RF PKG_P8PANELS_VISUAL.TFILTERS; -- Ôèëüòðû
RO PKG_P8PANELS_VISUAL.TORDERS; -- Ñîðòèðîâêè
RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Îïèñàíèå òàáëèöû
RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Ñòðîêà òàáëèöû
RCOL_VALS PKG_P8PANELS_VISUAL.TCOL_VALS; -- Ïðåäîïðåäåë¸ííûå çíà÷åíèÿ ñòîëáöîâ
NROW_FROM PKG_STD.TREF; -- Íîìåð ñòðîêè ñ
NROW_TO PKG_STD.TREF; -- Íîìåð ñòðîêè ïî
CSQL clob; -- Áóôåð äëÿ çàïðîñà
ICURSOR integer; -- Êóðñîð äëÿ èñïîëíåíèÿ çàïðîñà
RAGENT AGNLIST%rowtype; -- Áóôåð äëÿ çàïèñè êóðñîðà
begin
/* ×èòàåì ôèëüòðû */
RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS);
/* ×èòåì ñîðòèðîâêè */
RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
/* Ïðåîáðàçóåì íîìåð è ðàçìåð ñòðàíèöû â íîìåð ñòðîê ñ è ïî */
PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
NPAGE_SIZE => NPAGE_SIZE,
NROW_FROM => NROW_FROM,
NROW_TO => NROW_TO);
/* Èíèöèàëèçèðóåì òàáëèöó äàííûõ */
RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
/* Äîáàâëÿåì â òàáëèöó îïèñàíèå êîëîíîê */
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'RN',
SCAPTION => 'Ðåã. íîìåð',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BVISIBLE => false);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'AGNABBR',
SCAPTION => 'Ìíåìîêîä',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
SCOND_FROM => 'AgentAbbr',
BORDER => true,
BFILTER => true);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'AGNNAME',
SCAPTION => 'Íàèìåíîâàíèå',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
SCOND_FROM => 'AgentName',
BORDER => true,
BFILTER => true);
PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true);
PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'AGNTYPE',
SCAPTION => 'Òèï',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'AgentType',
BORDER => true,
BFILTER => true,
RCOL_VALS => RCOL_VALS);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'AGNBURN',
SCAPTION => 'Äàòà ðîæäåíèÿ',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
SCOND_FROM => 'AgentBornFrom',
SCOND_TO => 'AgentBornTo',
BORDER => true,
BFILTER => true);
/* Îáõîäèì äàííûå */
begin
/* Ñîáèðàåì çàïðîñ */
CSQL := 'select *
from (select D.*,
ROWNUM NROW
from (select AG.RN,
AG.AGNABBR,
AG.AGNNAME,
AG.AGNTYPE,
AG.AGNBURN
from AGNLIST AG
where AG.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F
where F.NROW between :NROW_FROM and :NROW_TO';
/* Ó÷ò¸ì ñîðòèðîâêè */
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
/* Ó÷ò¸ì ôèëüòðû */
PKG_P8PANELS_VISUAL.TFILTERS_SET_QUERY(NIDENT => NIDENT,
NCOMPANY => NCOMPANY,
SUNIT => 'AGNLIST',
SPROCEDURE => 'P_AGNLIST_BASE_COND',
RDATA_GRID => RDG,
RFILTERS => RF);
/* Ðàçáèðàåì åãî */
ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
/* Äåëàåì ïîäñòàíîâêó ïàðàìåòðîâ */
PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NIDENT', NVALUE => NIDENT);
PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
/* Îïèñûâàåì ñòðóêòóðó çàïèñè êóðñîðà */
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 4);
PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 5);
/* Äåëàåì âûáîðêó */
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
null;
end if;
/* Îáõîäèì âûáðàííûå çàïèñè */
while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
loop
/* Èçâëåêàåì î÷åðåäíóþ çàïèñü */
PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => RAGENT.RN);
PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 2, SVALUE => RAGENT.AGNABBR);
PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 3, SVALUE => RAGENT.AGNNAME);
PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 4, NVALUE => RAGENT.AGNTYPE);
PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 5, DVALUE => RAGENT.AGNBURN);
/* Èíèöèàëèçèðóåì ñòðîêó òàáëèöû äàííûõ */
RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE();
/* Äîáàâëÿåì êîëîíêè ñ äàííûìè */
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'RN', NVALUE => RAGENT.RN);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'AGNABBR', SVALUE => RAGENT.AGNABBR);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'AGNNAME', SVALUE => RAGENT.AGNNAME);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'AGNTYPE', NVALUE => RAGENT.AGNTYPE);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'AGNBURN', DVALUE => RAGENT.AGNBURN);
/* Äîáàâëÿåì ñòðîêó â òàáëèöó */
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
end loop;
/* Îñâîáîæäàåì êóðñîð */
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
exception
when others then
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
raise;
end;
/* Ñåðèàëèçóåì îïèñàíèå */
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
end;
/

View File

@ -0,0 +1,23 @@
create or replace procedure UDO_P_P8PANELS_TEST
(
NRN in number,
DDATE in date,
CFILTERS in clob,
CORDERS in clob,
NRES out number,
SRES out varchar2,
COUT out clob,
DD out date
)
is
begin
NRES:=NRN*2;
--DBMS_LOCK.SLEEP(3);
if (DDATE is not null) then p_exception(0, to_char(ddate, 'dd.mm.yyyy hh24:mi:ss')); end if;
SRES:='Î÷åíü õîðîøàÿ ïîãîäà';
COUT:='Ïðîñòî òåêñò';
--COUT:='<DATA><XROWS><COL1>333</COL1><COL2>444</COL2></XROWS><EXTRA>123</EXTRA><MORE>dfgsfg</MORE></DATA>';
--COUT:='<DATA><XOUT_ARGUMENTS><SNAME>333</SNAME><VALUE>444</VALUE></XOUT_ARGUMENTS><XOUT_ARGUMENTS><SNAME>qqq</SNAME><VALUE>555</VALUE></XOUT_ARGUMENTS><XOUT_ARGUMENTS><SNAME>qsvfvr</SNAME><VALUE>432</VALUE></XOUT_ARGUMENTS><EXTRA>123</EXTRA><MORE>dfgsfg</MORE></DATA>';
DD := DDATE;
end;
/