417 lines
20 KiB
SQL
417 lines
20 KiB
SQL
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 -- Сериализованное описание атрибутов сущности (BASE64 XML)
|
||
);
|
||
|
||
/* Добавление связи в запрос */
|
||
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; -- Коллекция существующих связей
|
||
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
|
||
/* Удаляем связи в которых он задействован */
|
||
PKG_P8PANELS_QE_BASE.TRLS_CLEANUP_BY_ATTR(RRLS => RRLS, SATTR_ID => RENT.RATTRS(I).SID);
|
||
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 -- Сериализованное описание атрибутов сущности (BASE64 XML)
|
||
)
|
||
is
|
||
RQ P8PNL_QE_QUERY%rowtype; -- Запись запроса
|
||
RENTS PKG_P8PANELS_QE_BASE.TENTS; -- Коллекция существующих сущностей
|
||
NENT_INDEX PKG_STD.TNUMBER; -- Индекс изменяемой сущности
|
||
RATTRS PKG_P8PANELS_QE_BASE.TATTRS; -- Коллекция полученных атриубтов
|
||
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);
|
||
/* Читаем существующие сущности */
|
||
RENTS := PKG_P8PANELS_QE_BASE.QUERY_ENTS_GET(CENTS => RQ.ENTS);
|
||
/* Читаем свзяи */
|
||
RRLS := PKG_P8PANELS_QE_BASE.QUERY_RLS_GET(CRLS => RQ.RLS);
|
||
/* Находим изменяемую сущность */
|
||
NENT_INDEX := PKG_P8PANELS_QE_BASE.TENTS_INDEX_BY_ID(RENTS => RENTS, SID => SID);
|
||
if (NENT_INDEX is null) then
|
||
P_EXCEPTION(0,
|
||
'Сущность с идентификатором "%s" в запросе "%s" не определена.',
|
||
COALESCE(SID, '<НЕ УКАЗАН>'),
|
||
TO_CHAR(NRN));
|
||
end if;
|
||
/* Десериализуем новый набор атрибутов */
|
||
RATTRS := PKG_P8PANELS_QE_BASE.TATTRS_FROM_XML_BASE64(CXML => CATTRS,
|
||
SCHARSET => PKG_CHARSET.CHARSET_UTF_(),
|
||
BADD_ROOT => true);
|
||
/* Сбросим текущие атрибуты сущности */
|
||
RENTS(NENT_INDEX).RATTRS := PKG_P8PANELS_QE_BASE.TATTRS();
|
||
/* Наполним полученными и зачистим связи */
|
||
if (RATTRS is not null) and (RATTRS.COUNT > 0) then
|
||
for I in RATTRS.FIRST .. RATTRS.LAST
|
||
loop
|
||
/* Если атрибут используется - кладём в обновленную коллекцию атрибутов сущности */
|
||
if (RATTRS(I).NUSE = 1) then
|
||
RENTS(NENT_INDEX).RATTRS.EXTEND();
|
||
RENTS(NENT_INDEX).RATTRS(RENTS(NENT_INDEX).RATTRS.LAST) := RATTRS(I);
|
||
else
|
||
/* Атрибут не используется - необходимо очистись связи в которых он задействован */
|
||
PKG_P8PANELS_QE_BASE.TRLS_CLEANUP_BY_ATTR(RRLS => RRLS, SATTR_ID => RATTRS(I).SID);
|
||
end if;
|
||
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_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;
|
||
/
|