forked from CITKParus/P8-Panels
703 lines
32 KiB
SQL
703 lines
32 KiB
SQL
create or replace package PKG_P8PANELS_PE_BASE as
|
||
|
||
/* Описание пользовательской процедуры */
|
||
procedure USERPROCS_DESC
|
||
(
|
||
SCODE in varchar2, -- Мнемокод пользовательской процедуры
|
||
COUT out clob -- Сериализованный список аргументов
|
||
);
|
||
|
||
/* Поиск рег. номера панели по мнемокоду */
|
||
procedure PANEL_FIND_BY_CODE
|
||
(
|
||
NFLAG_SMART in number, -- Признак генерации исключения (0 - да, 1 - нет)
|
||
NFLAG_OPTION in number, -- Признак генерации исключения для пустого sCODE (0 - да, 1 - нет)
|
||
SCODE in varchar2, -- Мнемокод панели
|
||
NRN out number -- Рег. номер панели
|
||
);
|
||
|
||
/* Получение признака возможности изменения панели */
|
||
function PANEL_ACCESS_SIGN_MODIFY
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
SUSER in varchar2 -- Имя пользователя
|
||
) return number; -- Признак возможности изменения панели (0 - нет, 1 - да)
|
||
|
||
|
||
/* Проверка возможности изменения панели */
|
||
procedure PANEL_ACCESS_MODIFY
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
SUSER in varchar2 -- Имя пользователя
|
||
);
|
||
|
||
/* Получение признака возможности просмотра панели */
|
||
function PANEL_ACCESS_SIGN_VIEW
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
SUSER in varchar2 -- Имя пользователя
|
||
) return number; -- Признак возможности просмотра панели (0 - нет, 1 - да)
|
||
|
||
/* Проверка возможности просмотра панели */
|
||
procedure PANEL_ACCESS_VIEW
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
SUSER in varchar2 -- Имя пользователя
|
||
);
|
||
|
||
/* Считывание базовой информации о панели */
|
||
procedure PANEL_ATTRS_GET
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
COUT out clob -- Базовой информация о панели
|
||
);
|
||
|
||
/* Добавление панели */
|
||
procedure PANEL_INSERT
|
||
(
|
||
SCODE in varchar2, -- Мнемокод
|
||
SNAME in varchar2, -- Наименование
|
||
NREADY in number := 0, -- Признак готовности к использованию
|
||
NPBL in number := 0, -- Публичность
|
||
CPANEL in clob := null, -- Описание панели
|
||
NRN out number -- Рег. номер добавленного запроса
|
||
);
|
||
|
||
/* Исправление панели */
|
||
procedure PANEL_UPDATE
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
SCODE in varchar2, -- Мнемокод
|
||
SNAME in varchar2 -- Наименование
|
||
);
|
||
|
||
/* Удаление панели */
|
||
procedure PANEL_DELETE
|
||
(
|
||
NRN in number -- Рег. номер панели
|
||
);
|
||
|
||
/* Установка признака "готовности" панели */
|
||
procedure PANEL_READY_SET
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
NREADY in number -- Флаг готовности к использованию (0 - нет, 1 - да)
|
||
);
|
||
|
||
/* Установка признака "публичности" панели */
|
||
procedure PANEL_PBL_SET
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
NPBL in number -- Флаг публичности (0 - приватный, 1 - публичный)
|
||
);
|
||
|
||
/* Загрузка описания панели */
|
||
function PANEL_DESC_GET
|
||
(
|
||
NRN in number -- Рег. номер панели
|
||
) return clob; -- XML-описание панели
|
||
|
||
/* Сохранение описания панели */
|
||
procedure PANEL_DESC_SET
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
CPANEL in clob -- Описание панели
|
||
);
|
||
|
||
/* Импорт панели из файла */
|
||
procedure PANEL_IMPORT
|
||
(
|
||
CPANEL in clob, -- Описание импортируемой панели
|
||
NRN out number -- Рег. номер импортированной панели
|
||
);
|
||
|
||
/* Формирование списка панелей */
|
||
function PANEL_LIST_GET
|
||
(
|
||
SUSER in varchar2 -- Имя пользователя
|
||
) return clob; -- Список панелей
|
||
|
||
end PKG_P8PANELS_PE_BASE;
|
||
/
|
||
create or replace package body PKG_P8PANELS_PE_BASE as
|
||
|
||
/* Константы - Теги для сериализации */
|
||
STAG_DATA constant PKG_STD.TSTRING := 'XDATA'; -- Данные
|
||
STAG_PANELS constant PKG_STD.TSTRING := 'XPANELS'; -- Панели
|
||
STAG_PANEL constant PKG_STD.TSTRING := 'XPANEL'; -- Панель
|
||
STAG_PANEL_INFO constant PKG_STD.TSTRING := 'XPANEL_INFO'; -- Информация о панели
|
||
STAG_PANEL_ATTRS constant PKG_STD.TSTRING := 'XPANEL_ATTRS'; -- Атрибуты панели
|
||
|
||
/* Константы - Атрибуты для сериализации */
|
||
SATTR_RN constant PKG_STD.TSTRING := 'rn'; -- Регистрационный номер
|
||
SATTR_CODE constant PKG_STD.TSTRING := 'code'; -- Код
|
||
SATTR_NAME constant PKG_STD.TSTRING := 'name'; -- Имя
|
||
SATTR_AUTHOR constant PKG_STD.TSTRING := 'author'; -- Автор
|
||
SATTR_CH_DATE constant PKG_STD.TSTRING := 'chDate'; -- Дата изменения
|
||
SATTR_READY constant PKG_STD.TSTRING := 'ready'; -- Готовность к использованию
|
||
SATTR_PBL constant PKG_STD.TSTRING := 'pbl'; -- Публичность
|
||
SATTR_MODIFY constant PKG_STD.TSTRING := 'modify'; -- Изменяемость
|
||
|
||
/* Описание пользовательской процедуры */
|
||
procedure USERPROCS_DESC
|
||
(
|
||
SCODE in varchar2, -- Мнемокод пользовательской процедуры
|
||
COUT out clob -- Сериализованный список аргументов
|
||
)
|
||
is
|
||
SRESP_ARG PKG_STD.TSTRING; -- Имя выходного визуализируемого параметра
|
||
begin
|
||
/* Обращаемся к процедуре */
|
||
for C in (select T.RN NRN,
|
||
T.PROCNAME SPROC_NAME,
|
||
T.PROCTYPE NPROC_TYPE
|
||
from USERPROCS T
|
||
where T.CODE = SCODE)
|
||
loop
|
||
/* Проверим возможность использования ПП в качестве источника данных */
|
||
if (C.NPROC_TYPE <> 0) then
|
||
P_EXCEPTION(0,
|
||
'Пользовательская процедура "%s" не может быть использована в качестве источника данных: должна иметь тип "Хранимая процедура".',
|
||
SCODE);
|
||
end if;
|
||
if (C.SPROC_NAME is null) then
|
||
P_EXCEPTION(0,
|
||
'Пользовательская процедура "%s" не может быть использована в качестве источника данных: не указана хранимая процедура.',
|
||
SCODE);
|
||
end if;
|
||
/* Начинаем формирование XML */
|
||
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
|
||
/* Открываем корень */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
|
||
/* Открываем описание процедуры */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'XUSERPROC');
|
||
/* Обходим параметры */
|
||
for P in (select T.PARAMTYPE NTYPE,
|
||
T.PARAMNAME SNAME,
|
||
T.NAME SCAPTION,
|
||
T.DATATYPE NDATA_TYPE,
|
||
case T.DATATYPE
|
||
when 0 then
|
||
'STR'
|
||
when 1 then
|
||
'NUMB'
|
||
when 2 then
|
||
'DATE'
|
||
else
|
||
null
|
||
end SDATA_TYPE,
|
||
T.MANDATORY NREQ,
|
||
T.VISUALIZE NVISUALIZE
|
||
from USERPROCSPARAMS T
|
||
where T.PRN = C.NRN
|
||
order by T.POSITION)
|
||
loop
|
||
/* В результирующий список забираем только входные поддерживаемого типа */
|
||
if ((P.NTYPE = 0) and (P.SDATA_TYPE is not null)) then
|
||
/* Открываем описание аргумента */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'arguments');
|
||
/* Описываем аргумент */
|
||
PKG_XFAST.ATTR(SNAME => 'name', SVALUE => P.SNAME);
|
||
PKG_XFAST.ATTR(SNAME => 'caption', SVALUE => P.SCAPTION);
|
||
PKG_XFAST.ATTR(SNAME => 'dataType', SVALUE => P.SDATA_TYPE);
|
||
PKG_XFAST.ATTR(SNAME => 'req',
|
||
BVALUE => case P.NREQ
|
||
when 1 then
|
||
true
|
||
else
|
||
false
|
||
end);
|
||
/* Закрываем описание аргумента */
|
||
PKG_XFAST.UP();
|
||
end if;
|
||
/* Если встретился визуализируемый параметр типа CLOB */
|
||
if ((P.NVISUALIZE = 1) and (P.NDATA_TYPE = 4)) then
|
||
if (SRESP_ARG is null) then
|
||
SRESP_ARG := P.SNAME;
|
||
else
|
||
/* Это уже второй такой - ошибка */
|
||
P_EXCEPTION(0,
|
||
'Пользовательская процедура "%s" не может быть использована в качестве источника данных: имеет более одного выходного параметра типа "Текстовые данные" с признаком "Визуализировать после выполнения".',
|
||
SCODE);
|
||
end if;
|
||
end if;
|
||
end loop;
|
||
/* Сформируем описание хранимой процедуры */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'stored');
|
||
PKG_XFAST.ATTR(SNAME => 'name', SVALUE => C.SPROC_NAME);
|
||
PKG_XFAST.ATTR(SNAME => 'respArg', SVALUE => SRESP_ARG);
|
||
PKG_XFAST.UP();
|
||
/* Закрываем описание процедуры */
|
||
PKG_XFAST.UP();
|
||
/* Закрываем описание корня */
|
||
PKG_XFAST.UP();
|
||
/* Сериализуем */
|
||
COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
|
||
/* Завершаем формирование XML */
|
||
PKG_XFAST.EPILOGUE();
|
||
end loop;
|
||
/* Если ничего не нашли */
|
||
if (COUT is null) then
|
||
P_EXCEPTION(0,
|
||
'Пользовательская процедура "%s" не определена.',
|
||
COALESCE(SCODE, '<НЕ УКАЗАНА>'));
|
||
end if;
|
||
/* Проверим возможность использования ПП в качестве источника данных - должен быть выходной визуализируемый параметр типа CLOB */
|
||
if (SRESP_ARG is null) then
|
||
P_EXCEPTION(0,
|
||
'Пользовательская процедура "%s" не может быть использована в качестве источника данных: должна иметь выходной параметр типа "Текстовые данные" с признаком "Визуализировать после выполнения".',
|
||
SCODE);
|
||
end if;
|
||
end USERPROCS_DESC;
|
||
|
||
/* Поиск рег. номера панели по мнемокоду */
|
||
procedure PANEL_FIND_BY_CODE
|
||
(
|
||
NFLAG_SMART in number, -- Признак генерации исключения (0 - да, 1 - нет)
|
||
NFLAG_OPTION in number, -- Признак генерации исключения для пустого sCODE (0 - да, 1 - нет)
|
||
SCODE in varchar2, -- Мнемокод панели
|
||
NRN out number -- Рег. номер панели
|
||
)
|
||
is
|
||
begin
|
||
/* Если мнемокод не задан */
|
||
if (RTRIM(SCODE) is null) then
|
||
/* Генерация исключения */
|
||
if (NFLAG_OPTION = 0) then
|
||
P_EXCEPTION(NFLAG_SMART, 'Не задан мнемокод панели.');
|
||
end if;
|
||
/* Мнемокод задан */
|
||
else
|
||
/* Поиск записи */
|
||
begin
|
||
select RN into NRN from P8PNL_PE_PANEL where CODE = SCODE;
|
||
exception
|
||
when NO_DATA_FOUND then
|
||
P_EXCEPTION(NFLAG_SMART, 'Панель "%s" не определена.', SCODE);
|
||
end;
|
||
end if;
|
||
end PANEL_FIND_BY_CODE;
|
||
|
||
/* Считывание записи панели */
|
||
function PANEL_GET
|
||
(
|
||
NRN in number -- Рег. номер панели
|
||
) return P8PNL_PE_PANEL%rowtype -- Запись панели
|
||
is
|
||
RRES P8PNL_PE_PANEL%rowtype; -- Буфер для результата
|
||
begin
|
||
/* Считываем запись */
|
||
select T.* into RRES from P8PNL_PE_PANEL T where T.RN = NRN;
|
||
/* Возвращаем запись */
|
||
return RRES;
|
||
exception
|
||
when NO_DATA_FOUND then
|
||
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NRN, SUNIT_TABLE => 'P8PNL_PE_PANEL');
|
||
end PANEL_GET;
|
||
|
||
/* Получение признака возможности изменения панели */
|
||
function PANEL_ACCESS_SIGN_MODIFY
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
SUSER in varchar2 -- Имя пользователя
|
||
) return number -- Признак возможности изменения панели (0 - нет, 1 - да)
|
||
is
|
||
RP P8PNL_PE_PANEL%rowtype; -- Проверяемая запись панели
|
||
begin
|
||
/* Читаем панель */
|
||
RP := PANEL_GET(NRN => NRN);
|
||
/* Менять можно только свою панель */
|
||
if (RP.AUTHOR = SUSER) then
|
||
return 1;
|
||
end if;
|
||
/* Проверки не пройдены - менять нельзя */
|
||
return 0;
|
||
end PANEL_ACCESS_SIGN_MODIFY;
|
||
|
||
/* Проверка возможности изменения панели */
|
||
procedure PANEL_ACCESS_MODIFY
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
SUSER in varchar2 -- Имя пользователя
|
||
)
|
||
is
|
||
begin
|
||
/* Получим признак возможности изменения */
|
||
if (PANEL_ACCESS_SIGN_MODIFY(NRN => NRN, SUSER => SUSER) = 0) then
|
||
/* Менять нельзя */
|
||
P_EXCEPTION(0, 'У Вас нет прав доступа для изменения панели.');
|
||
end if;
|
||
end PANEL_ACCESS_MODIFY;
|
||
|
||
/* Получение признака возможности просмотра панели */
|
||
function PANEL_ACCESS_SIGN_VIEW
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
SUSER in varchar2 -- Имя пользователя
|
||
) return number -- Признак возможности просмотра панели (0 - нет, 1 - да)
|
||
is
|
||
RP P8PNL_PE_PANEL%rowtype; -- Проверяемая запись панели
|
||
begin
|
||
/* Читаем панель */
|
||
RP := PANEL_GET(NRN => NRN);
|
||
/* Смотреть можно только свою или публичную и готовую панель */
|
||
if (((RP.PBL = 1) and (RP.READY = 1)) or (RP.AUTHOR = SUSER)) then
|
||
return 1;
|
||
end if;
|
||
/* Проверки не пройдены - нельзя смотреть */
|
||
return 0;
|
||
end PANEL_ACCESS_SIGN_VIEW;
|
||
|
||
/* Проверка возможности просмотра панели */
|
||
procedure PANEL_ACCESS_VIEW
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
SUSER in varchar2 -- Имя пользователя
|
||
)
|
||
is
|
||
begin
|
||
/* Получим признак возможности просмотра */
|
||
if (PANEL_ACCESS_SIGN_VIEW(NRN => NRN, SUSER => SUSER) = 0) then
|
||
/* Смотреть нельзя */
|
||
P_EXCEPTION(0, 'У Вас нет прав доступа для просмотра панели.');
|
||
end if;
|
||
end PANEL_ACCESS_VIEW;
|
||
|
||
/* Проверка атрибутов панели */
|
||
procedure PANEL_CHECK
|
||
(
|
||
SCODE in varchar2, -- Мнемокод
|
||
SNAME in varchar2 -- Наименование
|
||
)
|
||
is
|
||
begin
|
||
/* Мнемокод должен быть задан */
|
||
if (SCODE is null) then
|
||
P_EXCEPTION(0, 'Не задан мнемокод панели.');
|
||
end if;
|
||
/* Наименование должно быть задано */
|
||
if (SNAME is null) then
|
||
P_EXCEPTION(0, 'Не задано наименование панели.');
|
||
end if;
|
||
end PANEL_CHECK;
|
||
|
||
/* Синхронизация даты изменения панели с текущим временем */
|
||
procedure PANEL_CH_DATE_SYNC
|
||
(
|
||
NRN in number -- Рег. номер панели
|
||
)
|
||
is
|
||
begin
|
||
/* Установим текущую дату изменения */
|
||
update P8PNL_PE_PANEL T set T.CH_DATE = sysdate where T.RN = NRN;
|
||
/* Контроль изменения данных */
|
||
if (sql%notfound) then
|
||
PKG_MSG.RECORD_NOT_FOUND(NDOCUMENT => NRN, SUNIT_TABLE => 'P8PNL_PE_PANEL');
|
||
end if;
|
||
end PANEL_CH_DATE_SYNC;
|
||
|
||
/* Считывание базовой информации о панели */
|
||
procedure PANEL_ATTRS_GET
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
COUT out clob -- Базовой информация о панели
|
||
)
|
||
is
|
||
RP P8PNL_PE_PANEL%rowtype; -- Считываемая запись панели
|
||
begin
|
||
/* Читаем панель */
|
||
RP := PANEL_GET(NRN => NRN);
|
||
/* Начинаем формирование XML */
|
||
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
|
||
/* Открываем корень */
|
||
PKG_XFAST.DOWN_NODE(SNAME => STAG_DATA);
|
||
/* Открываем информацию о панели */
|
||
PKG_XFAST.DOWN_NODE(SNAME => STAG_PANEL_ATTRS);
|
||
/* Добавляем описание панели */
|
||
PKG_XFAST.ATTR(SNAME => SATTR_RN, NVALUE => RP.RN);
|
||
PKG_XFAST.ATTR(SNAME => SATTR_CODE, SVALUE => RP.CODE);
|
||
PKG_XFAST.ATTR(SNAME => SATTR_NAME, SVALUE => RP.NAME);
|
||
PKG_XFAST.ATTR(SNAME => SATTR_READY, NVALUE => RP.READY);
|
||
PKG_XFAST.ATTR(SNAME => SATTR_PBL, NVALUE => RP.PBL);
|
||
/* Закрываем информацию о панели */
|
||
PKG_XFAST.UP();
|
||
/* Закрываем корень */
|
||
PKG_XFAST.UP();
|
||
/* Сериализуем */
|
||
COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
|
||
/* Завершаем формирование XML */
|
||
PKG_XFAST.EPILOGUE();
|
||
exception
|
||
when others then
|
||
/* Завершаем формирование XML */
|
||
PKG_XFAST.EPILOGUE();
|
||
/* Вернем ошибку */
|
||
PKG_STATE.DIAGNOSTICS_STACKED();
|
||
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
|
||
end PANEL_ATTRS_GET;
|
||
|
||
/* Добавление панели */
|
||
procedure PANEL_INSERT
|
||
(
|
||
SCODE in varchar2, -- Мнемокод
|
||
SNAME in varchar2, -- Наименование
|
||
NREADY in number := 0, -- Признак готовности к использованию
|
||
NPBL in number := 0, -- Публичность
|
||
CPANEL in clob := null, -- Описание панели
|
||
NRN out number -- Рег. номер добавленного запроса
|
||
)
|
||
is
|
||
begin
|
||
/* Проверим параметры */
|
||
PANEL_CHECK(SCODE => SCODE, SNAME => SNAME);
|
||
/* Формируем рег. номер */
|
||
NRN := GEN_ID();
|
||
/* Добавляем данные */
|
||
insert into P8PNL_PE_PANEL
|
||
(RN, CODE, name, AUTHOR, CH_DATE, READY, PBL, PANEL)
|
||
values
|
||
(NRN, SCODE, SNAME, UTILIZER(), sysdate, NREADY, NPBL, CPANEL);
|
||
end PANEL_INSERT;
|
||
|
||
/* Исправление панели */
|
||
procedure PANEL_UPDATE
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
SCODE in varchar2, -- Мнемокод
|
||
SNAME in varchar2 -- Наименование
|
||
)
|
||
is
|
||
begin
|
||
/* Проверим параметры */
|
||
PANEL_CHECK(SCODE => SCODE, SNAME => SNAME);
|
||
/* Изменяем данные */
|
||
update P8PNL_PE_PANEL T
|
||
set T.CODE = SCODE,
|
||
T.NAME = SNAME
|
||
where T.RN = NRN;
|
||
/* Контроль изменения данных */
|
||
if (sql%notfound) then
|
||
PKG_MSG.RECORD_NOT_FOUND(NDOCUMENT => NRN, SUNIT_TABLE => 'P8PNL_PE_PANEL');
|
||
end if;
|
||
/* Обновим дату изменения панели */
|
||
PANEL_CH_DATE_SYNC(NRN => NRN);
|
||
end PANEL_UPDATE;
|
||
|
||
/* Удаление панели */
|
||
procedure PANEL_DELETE
|
||
(
|
||
NRN in number -- Рег. номер панели
|
||
)
|
||
is
|
||
begin
|
||
/* Удаляем запись */
|
||
delete from P8PNL_PE_PANEL T where T.RN = NRN;
|
||
/* Контроль изменения данных */
|
||
if (sql%notfound) then
|
||
PKG_MSG.RECORD_NOT_FOUND(NDOCUMENT => NRN, SUNIT_TABLE => 'P8PNL_PE_PANEL');
|
||
end if;
|
||
end PANEL_DELETE;
|
||
|
||
/* Установка признака "готовности" панели */
|
||
procedure PANEL_READY_SET
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
NREADY in number -- Флаг готовности к использованию (0 - нет, 1 - да)
|
||
)
|
||
is
|
||
begin
|
||
/* Проверим параметры */
|
||
if (NREADY is null) then
|
||
P_EXCEPTION(0,
|
||
'Не задано значение признака готовности панели к использованию.');
|
||
end if;
|
||
if (NREADY not in (0, 1)) then
|
||
P_EXCEPTION(0,
|
||
'Значение признака готовности панели к использованию задано некорректно (ожидалось 0 или 1).');
|
||
end if;
|
||
/* Установим флаг готовности к использованию */
|
||
update P8PNL_PE_PANEL T set T.READY = NREADY where T.RN = NRN;
|
||
/* Контроль изменения данных */
|
||
if (sql%notfound) then
|
||
PKG_MSG.RECORD_NOT_FOUND(NDOCUMENT => NRN, SUNIT_TABLE => 'P8PNL_PE_PANEL');
|
||
end if;
|
||
/* Обновим дату изменения панели */
|
||
PANEL_CH_DATE_SYNC(NRN => NRN);
|
||
end PANEL_READY_SET;
|
||
|
||
/* Установка признака "публичности" панели */
|
||
procedure PANEL_PBL_SET
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
NPBL in number -- Флаг публичности (0 - приватный, 1 - публичный)
|
||
)
|
||
is
|
||
begin
|
||
/* Проверим параметры */
|
||
if (NPBL is null) then
|
||
P_EXCEPTION(0, 'Не задано значение признака публичности запроса.');
|
||
end if;
|
||
if (NPBL not in (0, 1)) then
|
||
P_EXCEPTION(0,
|
||
'Значение признака публичноти запроса задано некорректно (ожидалось 0 или 1).');
|
||
end if;
|
||
/* Установим флаг публичности */
|
||
update P8PNL_PE_PANEL T set T.PBL = NPBL where T.RN = NRN;
|
||
/* Контроль изменения данных */
|
||
if (sql%notfound) then
|
||
PKG_MSG.RECORD_NOT_FOUND(NDOCUMENT => NRN, SUNIT_TABLE => 'P8PNL_PE_PANEL');
|
||
end if;
|
||
/* Обновим дату изменения панели */
|
||
PANEL_CH_DATE_SYNC(NRN => NRN);
|
||
end PANEL_PBL_SET;
|
||
|
||
/* Загрузка описания панели */
|
||
function PANEL_DESC_GET
|
||
(
|
||
NRN in number -- Рег. номер панели
|
||
) return clob -- XML-описание панели
|
||
is
|
||
RP P8PNL_PE_PANEL%rowtype; -- Запись панели
|
||
begin
|
||
/* Читаем панель */
|
||
RP := PANEL_GET(NRN => NRN);
|
||
/* Возвращаем результат */
|
||
return RP.PANEL;
|
||
end PANEL_DESC_GET;
|
||
|
||
/* Сохранение описания панели */
|
||
procedure PANEL_DESC_SET
|
||
(
|
||
NRN in number, -- Рег. номер панели
|
||
CPANEL in clob -- Описание панели
|
||
)
|
||
is
|
||
CPANEL_DATA clob; -- Данные описания панели
|
||
begin
|
||
/* Считываем данные описания панели */
|
||
CPANEL_DATA := BLOB2CLOB(LBDATA => BASE64_DECODE(LCSRCE => CPANEL), SCHARSET => PKG_CHARSET.CHARSET_UTF_());
|
||
/* Установим данные панели */
|
||
update P8PNL_PE_PANEL T set T.PANEL = CPANEL_DATA where T.RN = NRN;
|
||
/* Контроль изменения данных */
|
||
if (sql%notfound) then
|
||
PKG_MSG.RECORD_NOT_FOUND(NDOCUMENT => NRN, SUNIT_TABLE => 'P8PNL_PE_PANEL');
|
||
end if;
|
||
/* Обновим дату изменения панели */
|
||
PANEL_CH_DATE_SYNC(NRN => NRN);
|
||
exception
|
||
when others then
|
||
/* Завершаем формирование XML */
|
||
PKG_XFAST.EPILOGUE();
|
||
/* Вернем ошибку */
|
||
PKG_STATE.DIAGNOSTICS_STACKED();
|
||
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
|
||
end PANEL_DESC_SET;
|
||
|
||
/* Импорт панели */
|
||
procedure PANEL_IMPORT
|
||
(
|
||
CPANEL in clob, -- Описание импортируемой панели
|
||
NRN out number -- Рег. номер импортированной панели
|
||
)
|
||
is
|
||
RPARSEDOC PKG_XPATH.TDOCUMENT; -- Документ XML
|
||
RROOT PKG_XPATH.TNODE; -- Буфер узла документа
|
||
RP P8PNL_PE_PANEL%rowtype; -- Запись панели
|
||
CPANEL_DATA clob; -- Данные описания панели
|
||
begin
|
||
/* Считываем данные описания панели */
|
||
CPANEL_DATA := BLOB2CLOB(LBDATA => BASE64_DECODE(LCSRCE => CPANEL), SCHARSET => PKG_CHARSET.CHARSET_UTF_());
|
||
/* Преобразовываем CLOB */
|
||
RPARSEDOC := PKG_XPATH.PARSE_FROM_CLOB(LCXML => CPANEL_DATA);
|
||
/* Считываем корневой узел */
|
||
RROOT := PKG_XPATH.ROOT_NODE(RDOCUMENT => RPARSEDOC);
|
||
/* Считываем мнемокод */
|
||
RP.CODE := PKG_XPATH.VALUE(RNODE => RROOT, SPATTERN => STAG_PANEL || '/' || STAG_PANEL_INFO || '/' || SATTR_CODE);
|
||
/* Считываем наименование */
|
||
RP.NAME := PKG_XPATH.VALUE(RNODE => RROOT, SPATTERN => STAG_PANEL || '/' || STAG_PANEL_INFO || '/' || SATTR_NAME);
|
||
/* Если в описании панели не содержится основной информации о панели */
|
||
if ((RP.CODE is null) or (RP.NAME is null)) then
|
||
P_EXCEPTION(0,
|
||
'В описании импортируемой панели отсутствует информация о мнемокоде или наименовании.');
|
||
end if;
|
||
/* Считываем готовность к использованию */
|
||
RP.READY := PKG_XPATH.VALUE_NUM(RNODE => RROOT,
|
||
SPATTERN => STAG_PANEL || '/' || STAG_PANEL_INFO || '/' || SATTR_READY);
|
||
/* Считываем публичность */
|
||
RP.PBL := PKG_XPATH.VALUE_NUM(RNODE => RROOT, SPATTERN => STAG_PANEL || '/' || STAG_PANEL_INFO || '/' || SATTR_PBL);
|
||
/* Удаляем лишнюю информацию из описания панели и устанавливаем его */
|
||
RP.PANEL := REGEXP_REPLACE(CPANEL_DATA, '<' || STAG_PANEL_INFO || '>.*?</' || STAG_PANEL_INFO || '>', '');
|
||
/* Добавляем панель */
|
||
PANEL_INSERT(SCODE => RP.CODE,
|
||
SNAME => RP.NAME,
|
||
NREADY => COALESCE(RP.READY, 0),
|
||
NPBL => COALESCE(RP.PBL, 0),
|
||
CPANEL => RP.PANEL,
|
||
NRN => NRN);
|
||
end PANEL_IMPORT;
|
||
|
||
/* Формирование списка панелей */
|
||
function PANEL_LIST_GET
|
||
(
|
||
SUSER in varchar2 -- Имя пользователя
|
||
) return clob -- Список панелей
|
||
is
|
||
CRES clob; -- Буфер для сериализации
|
||
begin
|
||
/* Начинаем формирование XML */
|
||
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_, BALINE => true, BINDENT => true);
|
||
/* Открываем корень */
|
||
PKG_XFAST.DOWN_NODE(SNAME => STAG_DATA);
|
||
/* Открываем список запросов */
|
||
PKG_XFAST.DOWN_NODE(SNAME => STAG_PANELS);
|
||
/* Обходим запросы - данного пользователя и публичные */
|
||
for C in (select T.RN NRN,
|
||
T.CODE SCODE,
|
||
T.NAME SNAME,
|
||
UL.NAME SAUTHOR,
|
||
TO_CHAR(T.CH_DATE, 'dd.mm.yyyy hh24:mi:ss') SCH_DATE,
|
||
T.READY NREADY,
|
||
T.PBL NPBL,
|
||
PANEL_ACCESS_SIGN_MODIFY(T.RN, SUSER) NMODIFY
|
||
from P8PNL_PE_PANEL T,
|
||
USERLIST UL
|
||
where T.AUTHOR = UL.AUTHID
|
||
and PANEL_ACCESS_SIGN_VIEW(T.RN, SUSER) = 1
|
||
order by T.CODE)
|
||
loop
|
||
/* Открываем описание панели */
|
||
PKG_XFAST.DOWN_NODE(SNAME => STAG_PANEL);
|
||
/* Панель */
|
||
PKG_XFAST.ATTR(SNAME => SATTR_RN, NVALUE => C.NRN);
|
||
PKG_XFAST.ATTR(SNAME => SATTR_CODE, SVALUE => C.SCODE);
|
||
PKG_XFAST.ATTR(SNAME => SATTR_NAME, SVALUE => C.SNAME);
|
||
PKG_XFAST.ATTR(SNAME => SATTR_AUTHOR, SVALUE => C.SAUTHOR);
|
||
PKG_XFAST.ATTR(SNAME => SATTR_CH_DATE, SVALUE => C.SCH_DATE);
|
||
PKG_XFAST.ATTR(SNAME => SATTR_READY, NVALUE => C.NREADY);
|
||
PKG_XFAST.ATTR(SNAME => SATTR_PBL, NVALUE => C.NPBL);
|
||
PKG_XFAST.ATTR(SNAME => SATTR_MODIFY, NVALUE => C.NMODIFY);
|
||
/* Закрываем описание панели */
|
||
PKG_XFAST.UP();
|
||
end loop;
|
||
/* Закрываем список панелей */
|
||
PKG_XFAST.UP();
|
||
/* Закрываем корень */
|
||
PKG_XFAST.UP();
|
||
/* Сериализуем */
|
||
CRES := PKG_XFAST.SERIALIZE_TO_CLOB();
|
||
/* Завершаем формирование XML */
|
||
PKG_XFAST.EPILOGUE();
|
||
/* Возвращаем результат */
|
||
return CRES;
|
||
exception
|
||
when others then
|
||
/* Завершаем формирование XML */
|
||
PKG_XFAST.EPILOGUE();
|
||
/* Вернем ошибку */
|
||
PKG_STATE.DIAGNOSTICS_STACKED();
|
||
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
|
||
end PANEL_LIST_GET;
|
||
|
||
end PKG_P8PANELS_PE_BASE;
|
||
/
|