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 || '>.*?', ''); /* Добавляем панель */ 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; /