P8-Panels/db/PKG_P8PANELS_PE_BASE.pck

703 lines
32 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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