create or replace package PKG_P8PANELS_QE as /* Получение списка запросов */ procedure QUERY_LIST ( COUT out clob -- Сериализованный список запросов ); /* Добавление запроса */ procedure QUERY_INSERT ( SCODE in varchar2, -- Мнемокод SNAME in varchar2, -- Наименование NRN out number -- Рег. номер добавленного запроса ); /* Исправление запроса */ procedure QUERY_UPDATE ( NRN in number, -- Рег. номер запроса SCODE in varchar2, -- Мнемокод SNAME in varchar2 -- Наименование ); /* Удаление запроса */ procedure QUERY_DELETE ( NRN in number -- Рег. номер запроса ); /* Получение данных о запросе */ procedure QUERY_DESC ( NRN in number, -- Рег. номер запроса COUT out clob -- Сериализованное описание запроса ); /* Добавление сущности в запрос */ procedure QUERY_ENT_ADD ( NRN in number, -- Рег. номер запроса SNAME in varchar2, -- Имя STYPE in varchar2 -- Тип (см. константы SENT_TYPE_*) ); /* Удаление сущности из запроса */ procedure QUERY_ENT_REMOVE ( NRN in number, -- Рег. номер запроса SID in varchar2 -- Идентификатор сущности ); /* Установка координат сущности в редакторе диаграммы запроса */ procedure QUERY_ENT_POSITION_SET ( NRN in number, -- Рег. номер запроса SID in varchar2, -- Идентификатор сущности NX in number, -- Координата по оси абсцисс NY in number -- Координата по оси ординат ); /* Получение состава атрибутов сущности */ procedure QUERY_ENT_ATTRS_GET ( NRN in number, -- Рег. номер запроса SID in varchar2, -- Идентификатор сущности COUT out clob -- Сериализованное описание атрибутов сущности ); /* Установка состава атрибутов сущности */ procedure QUERY_ENT_ATTRS_SET ( NRN in number, -- Рег. номер запроса SID in varchar2, -- Идентификатор сущности CATTRS in clob -- Сериализованное описание атрибутов сущности ); /* Добавление связи в запрос */ procedure QUERY_RL_ADD ( NRN in number, -- Рег. номер запроса SSOURCE in varchar2, -- Идентификатор атрибута-источника STARGET in varchar2 -- Идентификатор атрибута-приёмника ); /* Удаление связи из запроса */ procedure QUERY_RL_REMOVE ( NRN in number, -- Рег. номер запроса SID in varchar2 -- Идентификатор связи ); /* Установка признака "готовности" запроса */ procedure QUERY_READY_SET ( NRN in number, -- Рег. номер запроса NREADY in number -- Флаг готовности к использованию (0 - нет, 1 - да) ); /* Установка признака "публичности" запроса */ procedure QUERY_PBL_SET ( NRN in number, -- Рег. номер запроса NPBL in number -- Флаг публичности (0 - приватный, 1 - публичный) ); end PKG_P8PANELS_QE; / create or replace package body PKG_P8PANELS_QE as /* Получение списка запросов */ procedure QUERY_LIST ( COUT out clob -- Сериализованный список запросов ) is begin /* Базово сформируем список */ COUT := PKG_P8PANELS_QE_BASE.QUERY_LIST_GET(SUSER => UTILIZER()); end QUERY_LIST; /* Добавление запроса */ procedure QUERY_INSERT ( SCODE in varchar2, -- Мнемокод SNAME in varchar2, -- Наименование NRN out number -- Рег. номер добавленного запроса ) is begin /* Базовое добавление */ PKG_P8PANELS_QE_BASE.QUERY_INSERT(SCODE => SCODE, SNAME => SNAME, NRN => NRN); end QUERY_INSERT; /* Исправление запроса */ procedure QUERY_UPDATE ( NRN in number, -- Рег. номер запроса SCODE in varchar2, -- Мнемокод SNAME in varchar2 -- Наименование ) is begin /* Провим права доступа */ PKG_P8PANELS_QE_BASE.QUERY_ACCESS_MODIFY(NRN => NRN, SUSER => UTILIZER()); /* Базовое исправление */ PKG_P8PANELS_QE_BASE.QUERY_UPDATE(NRN => NRN, SCODE => SCODE, SNAME => SNAME); end QUERY_UPDATE; /* Удаление запроса */ procedure QUERY_DELETE ( NRN in number -- Рег. номер запроса ) is begin /* Провим права доступа */ PKG_P8PANELS_QE_BASE.QUERY_ACCESS_MODIFY(NRN => NRN, SUSER => UTILIZER()); /* Базовое удаление */ PKG_P8PANELS_QE_BASE.QUERY_DELETE(NRN => NRN); end QUERY_DELETE; /* Получение описания запроса */ procedure QUERY_DESC ( NRN in number, -- Рег. номер запроса COUT out clob -- Сериализованное описание запроса ) is begin /* Проверим права доступа */ PKG_P8PANELS_QE_BASE.QUERY_ACCESS_VIEW(NRN => NRN, SUSER => UTILIZER()); /* Получим описание запроса */ COUT := PKG_P8PANELS_QE_BASE.QUERY_DESC_GET(NRN => NRN); end QUERY_DESC; /* Добавление сущности в запрос */ procedure QUERY_ENT_ADD ( NRN in number, -- Рег. номер запроса SNAME in varchar2, -- Имя STYPE in varchar2 -- Тип (см. константы SENT_TYPE_*) ) is RQ P8PNL_QE_QUERY%rowtype; -- Запись запроса RENTS PKG_P8PANELS_QE_BASE.TENTS; -- Коллекция существующих сущностей begin /* Провим права доступа */ PKG_P8PANELS_QE_BASE.QUERY_ACCESS_MODIFY(NRN => NRN, SUSER => UTILIZER()); /* Читаем запись запроса */ RQ := PKG_P8PANELS_QE_BASE.QUERY_GET(NRN => NRN); /* Читаем существующие сущности */ RENTS := PKG_P8PANELS_QE_BASE.QUERY_ENTS_GET(CENTS => RQ.ENTS); /* Формируем описание новой сущности и добавляем её в коллекцию */ PKG_P8PANELS_QE_BASE.TENTS_APPEND(RENTS => RENTS, SNAME => SNAME, STYPE => STYPE); /* Сохраняем обновленный набор сущностей */ PKG_P8PANELS_QE_BASE.QUERY_ENTS_SET(NRN => RQ.RN, RENTS => RENTS); end QUERY_ENT_ADD; /* Удаление сущности из запроса */ procedure QUERY_ENT_REMOVE ( NRN in number, -- Рег. номер запроса SID in varchar2 -- Идентификатор сущности ) is RQ P8PNL_QE_QUERY%rowtype; -- Запись запроса RENTS PKG_P8PANELS_QE_BASE.TENTS; -- Коллекция существующих сущностей RENT PKG_P8PANELS_QE_BASE.TENT; -- Удаляемая сущность RRLS PKG_P8PANELS_QE_BASE.TRLS; -- Коллекция существующих связей RRLS_TMP PKG_P8PANELS_QE_BASE.TRLS; -- Буфер для коллекции удаляемых связей begin /* Провим права доступа */ PKG_P8PANELS_QE_BASE.QUERY_ACCESS_MODIFY(NRN => NRN, SUSER => UTILIZER()); /* Читаем запись запроса */ RQ := PKG_P8PANELS_QE_BASE.QUERY_GET(NRN => NRN); /* Читаем существующие сущности */ RENTS := PKG_P8PANELS_QE_BASE.QUERY_ENTS_GET(CENTS => RQ.ENTS); /* Читаем свзяи */ RRLS := PKG_P8PANELS_QE_BASE.QUERY_RLS_GET(CRLS => RQ.RLS); /* Находим удаляемую сущность */ begin RENT := RENTS(PKG_P8PANELS_QE_BASE.TENTS_INDEX_BY_ID(RENTS => RENTS, SID => SID)); exception when VALUE_ERROR then P_EXCEPTION(0, 'Сущность с идентификатором "%s" в запросе "%s" не определена.', COALESCE(SID, '<НЕ УКАЗАН>'), TO_CHAR(NRN)); end; /* Удаляем сущность из коллекции */ PKG_P8PANELS_QE_BASE.TENTS_REMOVE(RENTS => RENTS, SID => SID); /* Обходим атрибуты сущности */ if ((RENT.RATTRS is not null) and (RENT.RATTRS.COUNT > 0)) then for I in RENT.RATTRS.FIRST .. RENT.RATTRS.LAST loop /* Если атрибут есть в связях (как источник или как приёмник) */ for J in 0 .. 1 loop RRLS_TMP := PKG_P8PANELS_QE_BASE.TRLS_LIST_BY_ST(RRLS => RRLS, SSOURCE_TARGET => RENT.RATTRS(I).SID, NLIST_TYPE => J); /* То связь должна быть удалена */ if ((RRLS_TMP is not null) and (RRLS_TMP.COUNT > 0)) then for K in RRLS_TMP.FIRST .. RRLS_TMP.LAST loop PKG_P8PANELS_QE_BASE.TRLS_REMOVE(RRLS => RRLS, SID => RRLS_TMP(K).SID); end loop; end if; end loop; end loop; end if; /* Сохраняем обновленный набор сущностей */ PKG_P8PANELS_QE_BASE.QUERY_ENTS_SET(NRN => RQ.RN, RENTS => RENTS); /* Сохраняем обновленный набор связей */ PKG_P8PANELS_QE_BASE.QUERY_RLS_SET(NRN => RQ.RN, RRLS => RRLS); end QUERY_ENT_REMOVE; /* Установка координат сущности в редакторе диаграммы запроса */ procedure QUERY_ENT_POSITION_SET ( NRN in number, -- Рег. номер запроса SID in varchar2, -- Идентификатор сущности NX in number, -- Координата по оси абсцисс NY in number -- Координата по оси ординат ) is RQ P8PNL_QE_QUERY%rowtype; -- Запись запроса RENTS PKG_P8PANELS_QE_BASE.TENTS; -- Коллекция существующих сущностей begin /* Читаем запись запроса */ RQ := PKG_P8PANELS_QE_BASE.QUERY_GET(NRN => NRN); /* Сохранять расположение будем только если это автор - так остальные могут перемещать на экране диаграмму, но не запоминать расположение сущностей */ if (RQ.AUTHOR = UTILIZER()) then /* Читаем существующие сущности */ RENTS := PKG_P8PANELS_QE_BASE.QUERY_ENTS_GET(CENTS => RQ.ENTS); /* Меняем координаты сущности в коллекции */ PKG_P8PANELS_QE_BASE.TENTS_POSITION_SET(RENTS => RENTS, SID => SID, NX => NX, NY => NY); /* Сохраняем обновленный набор сущностей */ PKG_P8PANELS_QE_BASE.QUERY_ENTS_SET(NRN => RQ.RN, RENTS => RENTS); end if; end QUERY_ENT_POSITION_SET; /* Получение состава атрибутов сущности */ procedure QUERY_ENT_ATTRS_GET ( NRN in number, -- Рег. номер запроса SID in varchar2, -- Идентификатор сущности COUT out clob -- Сериализованное описание атрибутов сущности ) is begin /* Провим права доступа */ PKG_P8PANELS_QE_BASE.QUERY_ACCESS_MODIFY(NRN => NRN, SUSER => UTILIZER()); /* Сформируем описание атрибутов */ PKG_P8PANELS_QE_BASE.QUERY_ENT_ATTRS_GET(NRN => NRN, SID => SID, COUT => COUT); end QUERY_ENT_ATTRS_GET; /* Установка состава атрибутов сущности */ procedure QUERY_ENT_ATTRS_SET ( NRN in number, -- Рег. номер запроса SID in varchar2, -- Идентификатор сущности CATTRS in clob -- Сериализованное описание атрибутов сущности ) is begin null; end QUERY_ENT_ATTRS_SET; /* Добавление связи в запрос */ procedure QUERY_RL_ADD ( NRN in number, -- Рег. номер запроса SSOURCE in varchar2, -- Идентификатор атрибута-источника STARGET in varchar2 -- Идентификатор атрибута-приёмника ) is RQ P8PNL_QE_QUERY%rowtype; -- Запись запроса RRLS PKG_P8PANELS_QE_BASE.TRLS; -- Коллекция существующих связей begin /* Провим права доступа */ PKG_P8PANELS_QE_BASE.QUERY_ACCESS_MODIFY(NRN => NRN, SUSER => UTILIZER()); /* Читаем запись запроса */ RQ := PKG_P8PANELS_QE_BASE.QUERY_GET(NRN => NRN); /* Читаем существующие связи */ RRLS := PKG_P8PANELS_QE_BASE.QUERY_RLS_GET(CRLS => RQ.RLS); /* Формируем описание новой связи и добавляем её в коллекцию */ PKG_P8PANELS_QE_BASE.TRLS_APPEND(RRLS => RRLS, SSOURCE => SSOURCE, STARGET => STARGET); /* Сохраняем обновленный набор связей */ PKG_P8PANELS_QE_BASE.QUERY_RLS_SET(NRN => RQ.RN, RRLS => RRLS); end QUERY_RL_ADD; /* Удаление связи из запроса */ procedure QUERY_RL_REMOVE ( NRN in number, -- Рег. номер запроса SID in varchar2 -- Идентификатор связи ) is RQ P8PNL_QE_QUERY%rowtype; -- Запись запроса RRLS PKG_P8PANELS_QE_BASE.TRLS; -- Коллекция существующих связей begin /* Провим права доступа */ PKG_P8PANELS_QE_BASE.QUERY_ACCESS_MODIFY(NRN => NRN, SUSER => UTILIZER()); /* Читаем запись запроса */ RQ := PKG_P8PANELS_QE_BASE.QUERY_GET(NRN => NRN); /* Читаем существующие связи */ RRLS := PKG_P8PANELS_QE_BASE.QUERY_RLS_GET(CRLS => RQ.RLS); /* Удаляем связи из коллекции */ PKG_P8PANELS_QE_BASE.TRLS_REMOVE(RRLS => RRLS, SID => SID); /* Сохраняем обновленный набор связей */ PKG_P8PANELS_QE_BASE.QUERY_RLS_SET(NRN => RQ.RN, RRLS => RRLS); end QUERY_RL_REMOVE; /* Установка признака "готовности" запроса */ procedure QUERY_READY_SET ( NRN in number, -- Рег. номер запроса NREADY in number -- Флаг готовности к использованию (0 - нет, 1 - да) ) is begin /* Провим права доступа */ PKG_P8PANELS_QE_BASE.QUERY_ACCESS_MODIFY(NRN => NRN, SUSER => UTILIZER()); /* Базовая установка признака готовности */ PKG_P8PANELS_QE_BASE.QUERY_READY_SET(NRN => NRN, NREADY => NREADY); end QUERY_READY_SET; /* Установка признака "публичности" запроса */ procedure QUERY_PBL_SET ( NRN in number, -- Рег. номер запроса NPBL in number -- Флаг публичности (0 - приватный, 1 - публичный) ) is begin /* Провим права доступа */ PKG_P8PANELS_QE_BASE.QUERY_ACCESS_MODIFY(NRN => NRN, SUSER => UTILIZER()); /* Базовая установка признака публичности */ PKG_P8PANELS_QE_BASE.QUERY_PBL_SET(NRN => NRN, NPBL => NPBL); end QUERY_PBL_SET; end PKG_P8PANELS_QE; /