TCF-Framework-Integration/db/UDO_PKG_EQUIPDS_BASE.pck

1491 lines
90 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 UDO_PKG_EQUIPDS_BASE as
/* Константы - состояния "Выборки данных оборудования (классы оборудования, файлы данных)" */
NCMFL_STATUS_REGISTERED constant PKG_STD.TNUMBER := 0; -- Зарегистрирован
NCMFL_STATUS_UPLOADING constant PKG_STD.TNUMBER := 1; -- Загружается на сервер
NCMFL_STATUS_UPLOADED constant PKG_STD.TNUMBER := 2; -- Успешно загружен на сервер
NCMFL_STATUS_UPLOAD_ERR constant PKG_STD.TNUMBER := 3; -- Ошибка загрузки на сервер
NCMFL_STATUS_SENDING constant PKG_STD.TNUMBER := 4; -- Загружается во внешнюю систему
NCMFL_STATUS_SENT constant PKG_STD.TNUMBER := 5; -- Успешно загружен во внешнюю систему
NCMFL_STATUS_SEND_ERR constant PKG_STD.TNUMBER := 6; -- При загрузке во внешнюю систему произошла ошибка
/* Константы - типовые задачи "Выборки данных оборудования (классы оборудования, модели)" */
SCMML_TASK_TCF constant PKG_STD.TSTRING := 'TCF'; -- TCF - оценка технического состояния (Technical Condition Forecast)
SCMML_TASK_RUL constant PKG_STD.TSTRING := 'RUL'; -- RUL - прогнозирование остаточного ресурса (Remaining Useful Life)
SCMML_TASK_FP constant PKG_STD.TSTRING := 'FP'; -- FP - Прогнозирование отказа (Failure Predict)
/* Константы - состояния "Выборки данных оборудования (классы оборудования, модели)" */
NCMML_STATUS_REGISTERED constant PKG_STD.TNUMBER := 0; -- Зарегистрирована
NCMML_STATUS_PROCESSING constant PKG_STD.TNUMBER := 1; -- Обрабатывается внешней системой
NCMML_STATUS_PROCESSED constant PKG_STD.TNUMBER := 2; -- Успешно обработана внешней системой
NCMML_STATUS_PROCESS_ERR constant PKG_STD.TNUMBER := 3; -- При обработке внешней системой произошла ошибка
/* Проверка прав доступа */
function UTL_ACCESS_CHECK
(
SUSER in varchar2, -- Пользователь
STABLE in varchar2, -- Таблица раздела
SACTION in varchar2, -- Действие в разделе
NDOCUMENT in number := null -- Регистрационный номер документа
) return boolean; -- Флаг доступа (false - нет доступа, true - доступ есть)
/* Проверка прав доступа (процедурная обёртка) */
procedure UTL_ACCESS
(
STABLE in varchar2, -- Таблица раздела
SACTION in varchar2, -- Действие в разделе
NDOCUMENT in number :=null -- Регистрационный номер документа
);
/* Формирование наименования выборки данных по идентификатору и времени формирования */
function UTL_DATASET_MAKE_NAME
(
NDATASET_ID in number, -- Идентификатор данных
DDATASET_TS in date -- Время формирования данных
) return varchar2; -- Наименование выборки
/* Сериализация описания параметров выборки для прогноза */
procedure UTL_FORECAST_RQ_MAKE_CFG
(
DBEG in date, -- Дата "С"
DEND in date, -- Дата "По"
NINTERVAL in number, -- Длина интервала (в днях, если меньше дня, то дробное - 1/24 для часа, например)
CRQ_CFG out clob -- Сериализованное описание параметров выборки для прогноза
);
/* Десериализация описания параметров выборки для прогноза */
procedure UTL_FORECAST_RQ_PARSE_CFG
(
CRQ_CFG in clob, -- Сериализованное описание параметров выборки для прогноза
DBEG out date, -- Дата "С"
DEND out date, -- Дата "По"
NINTERVAL out number -- Длина интервала (в днях, если меньше дня, то дробное - 1/24 для часа, например)
);
/* Считывание записи "Выборки данных оборудования" по регистрационному номеру */
function GET
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NRN in number -- Регистрационный номер
) return UDO_T_EQUIPDS%rowtype; -- Запись выборки данных оборудования
/* Поиск "Выборки данных оборудования" по мнемокоду */
procedure FIND_BY_CODE
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NCOMPANY in number, -- Организация
SCODE in varchar2, -- Мнемокод
NRN out number -- Регистрационный номер
);
/* Базовое добавление "Выборки данных оборудования" */
procedure INS
(
NCOMPANY in number, -- Организация
SCODE in varchar2, -- Мнемокод
SNAME in varchar2, -- Наименование
NRN out number -- Регистрационный номер
);
/* Базовое исправление "Выборки данных оборудования" */
procedure UPD
(
NRN in number, -- Регистрационный номер
NCOMPANY in number, -- Организация
SCODE in varchar2, -- Мнемокод
SNAME in varchar2 -- Наименование
);
/* Базовое удаление "Выборки данных оборудования" */
procedure DEL
(
NRN in number, -- Регистрационный номер
NCOMPANY in number -- Организация
);
/* Считывание записи "Выборки данных оборудования (классы оборудования)" по регистрационному номеру */
function CM_GET
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NRN in number -- Регистрационный номер
) return UDO_T_EQUIPDSCM%rowtype; -- Запись класса оборудования выборки данных
/* Поиск "Выборки данных оборудования (классы оборудования)" по классу оборудования */
procedure CM_FIND_BY_EQOBJKIND
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NCOMPANY in number, -- Организация
SEQOBJKIND in varchar2, -- Класс оборудования (полный иерархический код)
NRN out number -- Регистрационный номер
);
/* Разыменование словарей "Выборки данных оборудования (классы оборудования)" */
procedure CM_JOINS
(
NCOMPANY in number, -- Организация
SEQOBJKIND in varchar2, -- Класс оборудования
SDICMUNTS in varchar2, -- Единица измерения выборки
SUSERPROCS_DATA in varchar2, -- Процедура формирования
SEXSSERVICE_UPLOAD in varchar2, -- Сервис обмена для выгрузки данных
SEXSSERVICEFN_UPLOAD in varchar2, -- Функция обмена для выгрузки данных
SEXSSERVICE_SEND_MD in varchar2, -- Сервис обмена для передачи внешней системе
SEXSSERVICEFN_SEND_MD in varchar2, -- Функция обмена для передачи внешней системе
SEXSSERVICE_SEND_MDCB in varchar2, -- Сервис обмена для приёма Call-back запросов с результатами передачи внешней системе
SEXSSERVICEFN_SEND_MDCB in varchar2, -- Функция сервиса обмена для приёма Call-back запросов с результатами передачи внешней системе
SEXSSERVICE_SEND_RQ in varchar2, -- Сервис обмена для обработки внешней системой
SEXSSERVICEFN_SEND_RQ in varchar2, -- Функция обмена для обработки внешней системой
SEXSSERVICE_SEND_RQCB in varchar2, -- Сервис обмена для приёма Call-back запросов с результатами обработки внешней системой
SEXSSERVICEFN_SEND_RQCB in varchar2, -- Функция обмена для приёма Call-back запросов с результатами обработки внешней системой
SEXSSERVICE_FRCST_MD in varchar2, -- Сервис обмена для публикации данных наработки оборудования при получении прогноза
SEXSSERVICEFN_FRCST_MD in varchar2, -- Функция обмена для публикации данных наработки оборудования при получении прогноза
NEQOBJKIND out number, -- Рег. номер класса оборудования
NDICMUNTS out number, -- Рег. номер единицы измерения выборки
NUSERPROCS_DATA out number, -- Рег. номер процедуры формирования
NEXSSERVICEFN_UPLOAD out number, -- Рег. номер функции обмена для выгрузки данных
NEXSSERVICEFN_SEND_MD out number, -- Рег. номер Функции обмена для передачи внешней системе
NEXSSERVICEFN_SEND_MDCB out number, -- Рег. номер call-back функции обмена для передачи внешней системе
NEXSSERVICEFN_SEND_RQ out number, -- Рег. номер функции обмена для обработки внешней системой
NEXSSERVICEFN_SEND_RQCB out number, -- Рег. номер call-back функции обмена для обработки внешней системой
NEXSSERVICEFN_FRCST_MD out number -- Рег. номер функции обмена для публикации данных наработки оборудования при получении прогноза
);
/* Базовое добавление "Выборки данных оборудования (классы оборудования)" */
procedure CM_INS
(
NPRN in number, -- Родитель
NEQOBJKIND in number, -- Класс оборудования
NDICMUNTS in number, -- Единица измерения выборки
NUSERPROCS_DATA in number, -- Процедура формирования
NEXSSERVICEFN_UPLOAD in number, -- Функция обмена для выгрузки данных
NEXSSERVICEFN_SEND_MD in number, -- Функция обмена для передачи внешней системе
NEXSSERVICEFN_SEND_MDCB in number, -- Call-back функции обмена для передачи внешней системе
NEXSSERVICEFN_SEND_RQ in number, -- Функция обмена для обработки внешней системой
NEXSSERVICEFN_SEND_RQCB in number, -- Call-back функции обмена для обработки внешней системой
NEXSSERVICEFN_FRCST_MD in number, -- Функция обмена для публикации данных наработки оборудования при получении прогноза
NRN out number -- Регистрационный номер
);
/* Базовое исправление "Выборки данных оборудования (классы оборудования)" */
procedure CM_UPD
(
NRN in number, -- Регистрационный номер
NEQOBJKIND in number, -- Класс оборудования
NDICMUNTS in number, -- Единица измерения выборки
NUSERPROCS_DATA in number, -- Процедура формирования
NEXSSERVICEFN_UPLOAD in number, -- Функция обмена для выгрузки данных
NEXSSERVICEFN_SEND_MD in number, -- Функция обмена для передачи внешней системе
NEXSSERVICEFN_SEND_MDCB in number, -- Call-back функции обмена для передачи внешней системе
NEXSSERVICEFN_SEND_RQ in number, -- Функция обмена для обработки внешней системой
NEXSSERVICEFN_SEND_RQCB in number, -- Call-back функции обмена для обработки внешней системой
NEXSSERVICEFN_FRCST_MD in number -- Функция обмена для публикации данных наработки оборудования при получении прогноза
);
/* Базовое удаление "Выборки данных оборудования (классы оборудования)" */
procedure CM_DEL
(
NRN in number -- Регистрационный номер
);
/* Базовая установка описания структуры выборки "Выборки данных оборудования (классы оборудования)" */
procedure CM_SET_DATA_CONFIG
(
NRN in number, -- Регистрационный номер
BDATA_CONFIG in clob -- Описание структуры выборки
);
/* Считывание записи "Выборки данных оборудования (классы оборудования, файлы данных)" по регистрационному номеру */
function CMFL_GET
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NRN in number -- Регистрационный номер
) return UDO_T_EQUIPDSCMFL%rowtype; -- Запись файла данных класса оборудования выборки данных
/* Базовое добавление "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_INS
(
NPRN in number, -- Родитель
SFILE_NAME in varchar2, -- Имя файла
SDESCR in varchar2, -- Описание
BDATASET in blob, -- Данные выборки
NDATASET_ID in number, -- Идентификатор данных
DDATASET_TS in date, -- Время формирования данных
NRN out number -- Регистрационный номер
);
/* Базовое удаление "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_DEL
(
NRN in number -- Регистрационный номер
);
/* Базовая установка имени файла "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_SET_FILE_NAME
(
NRN in number, -- Регистрационный номер
SFILE_NAME in varchar2 -- Имя файла
);
/* Базовая установка состояния "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_SET_STATUS
(
NRN in number, -- Регистрационный номер
NSTATUS in number, -- Состояние (см. константы NCMFL_STATUS_*)
SQUEUE_ID in varchar2 := null, -- Идентификатор очереди обработки
SERR in varchar2 := null -- Сообщение об ошибке
);
/* Считывание записи "Выборки данных оборудования (классы оборудования, модели)" по регистрационному номеру */
function CMML_GET
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NRN in number -- Регистрационный номер
) return UDO_T_EQUIPDSCMML%rowtype; -- Запись модели класса оборудования выборки данных
/* Поиск "Выборки данных оборудования (классы оборудования, модели)" по задаче */
procedure CMML_FIND_BY_TASK
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NPRN in number, -- Родитель
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*)
NRN out number -- Регистрационный номер
);
/* Разыменование словарей "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_JOINS
(
SUSERPROCS_FRCST_DATA in varchar2, -- Пользовательская процедура формирования данных для прогноза
NUSERPROCS_FRCST_DATA out number -- Рег. номер пользовательской процедуры формирования данных для прогноза
);
/* Базовое добавление "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_INS
(
NPRN in number, -- Родитель
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*)
NDATASET_ID in number, -- Идентификатор выборки
NUSERPROCS_FRCST_DATA in number, -- Рег. номер пользовательской процедуры формирования данных для прогноза
NRN out number -- Регистрационный номер
);
/* Базовое исправление "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_UPD
(
NRN in number, -- Регистрационный номер
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*)
NUSERPROCS_FRCST_DATA in number -- Рег. номер пользовательской процедуры формирования данных для прогноза
);
/* Базовое удаление "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_DEL
(
NRN in number -- Регистрационный номер
);
/* Базовая установка точности "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_SET_PRECISION
(
NRN in number, -- Регистрационный номер
NPRECISION in number -- Точность
);
/* Базовая установка состояния "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_SET_STATUS
(
NRN in number, -- Регистрационный номер
NSTATUS in number, -- Состояние (см. константы NCMML_STATUS_*)
SQUEUE_ID in varchar2 := null, -- Идентификатор очереди обработки
SERR in varchar2 := null -- Сообщение об ошибке
);
/* Формирование наименования для задачи "Выборки данных оборудования (классы оборудования, модели)" */
function CMML_TASK_NAME
(
STASK in varchar2 -- Задача (см. константы SCMML_TASK_*)
) return varchar2; -- Наименование задачи
/* Формирование подсказки для задачи "Выборки данных оборудования (классы оборудования, модели)" */
function CMML_TASK_HINT
return varchar2; -- Подсказка для задачи
/* Формирование подсказки для процедуры формирования данных для прогноза "Выборки данных оборудования (классы оборудования, модели)" */
function CMML_USERPROCS_FRCST_DATA_HINT
return varchar2; -- Подсказка для процедуры формирования данных для прогноза
/* Считывание записи "Выборки данных оборудования (классы оборудования, модели, история запросов)" по регистрационному номеру */
function CMMLH_GET
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NRN in number -- Регистрационный номер
) return UDO_T_EQUIPDSCMMLH%rowtype; -- Запись итории прогонозов модели
/* Базовое добавление "Выборки данных оборудования (классы оборудования, модели, история запросов)" */
procedure CMMLH_INS
(
NPRN in number, -- Родитель
NEQCONFIG in number, -- Рег. номер технического объекта
SRQ_AUTHID in varchar2, -- Пользователь, выполнивший запрос
DRQ_DATE in date, -- Дата/время запроса
BRQ in blob, -- Параметры запроса
NRN out number -- Регистрационный номер
);
/* Базовое удаление "Выборки данных оборудования (классы оборудования, модели, история запросов)" */
procedure CMMLH_DEL
(
NRN in number -- Регистрационный номер
);
/* Базовая установка данных прогноза "Выборки данных оборудования (классы оборудования, файлы данных, история запросов)" */
procedure CMMLH_SET_FORECAST
(
NRN in number, -- Регистрационный номер
BFORECAST in blob, -- Данные прогноза
DFORECAST_DATE in date, -- Дата прогноза
NFORECAST_DAYS in number -- Прогноз (дней до выхода из строя на дату прогноза)
);
/* Вычисление количества дней до выхода из строя от даты */
function CMMLH_FORECAST_DAYS_NOW
(
DFORECAST_DATE in date, -- Дата прогноза
NFORECAST_DAYS in number, -- RUL-прогноз (дней до перехода в предельное состояние от даты прогноза)
DDATE in date := sysdate -- Дата (не задана - текущая)
) return number; -- Количество дней до выхода из строя
/* Вычисление вероятности выхода из строя на дату по RUL-прогнозу */
function CMMLH_RUL_BREAKDOWN_PROB
(
DFORECAST_DATE in date, -- Дата прогноза
NFORECAST_DAYS in number, -- RUL-прогноз (дней до перехода в предельное состояние от даты прогноза)
DDATE in date -- Дата на
) return number; -- Значение вероятности
end UDO_PKG_EQUIPDS_BASE;
/
create or replace package body UDO_PKG_EQUIPDS_BASE as
/*Константы - мнемокод роли администратора, разрешающей обучение моделей */
SROLE_ML_ADMIN constant PKG_STD.TSTRING := 'ML_ADMIN';
/* Проверка прав доступа */
function UTL_ACCESS_CHECK
(
SUSER in varchar2, -- Пользователь
STABLE in varchar2, -- Таблица раздела
SACTION in varchar2, -- Действие в разделе
NDOCUMENT in number := null -- Регистрационный номер документа
) return boolean -- Флаг доступа (false - нет доступа, true - доступ есть)
is
begin
/* Проверим наличие роли администратора у пользователя */
for C in (select UR.RN
from USERROLES UR,
ROLES R,
USERLIST UL
where UR.ROLEID = R.RN
and UR.AUTHID = UL.AUTHID
and UL.AUTHID = SUSER
and R.ROLENAME = SROLE_ML_ADMIN)
loop
/* Роль есть */
return true;
end loop;
/* Прав доступа нет */
return false;
end UTL_ACCESS_CHECK;
/* Проверка прав доступа (процедурная обёртка) */
procedure UTL_ACCESS
(
STABLE in varchar2, -- Таблица раздела
SACTION in varchar2, -- Действие в разделе
NDOCUMENT in number :=null -- Регистрационный номер документа
)
is
begin
if (not UDO_PKG_EQUIPDS_BASE.UTL_ACCESS_CHECK(SUSER => UTILIZER(),
STABLE => STABLE,
SACTION => SACTION,
NDOCUMENT => NDOCUMENT)) then
P_EXCEPTION(0,
'У вас нет прав доступа для выполнения действия "%s" в таблице "%s".',
SACTION,
STABLE);
end if;
end UTL_ACCESS;
/* Формирование наименования выборки данных по идентификатору и времени формирования */
function UTL_DATASET_MAKE_NAME
(
NDATASET_ID in number, -- Идентификатор данных
DDATASET_TS in date -- Время формирования данных
) return varchar2 -- Наименование выборки
is
begin
return '' || TO_CHAR(NDATASET_ID) || ' от ' || TO_CHAR(DDATASET_TS, 'dd.mm.yyyy hh24:mi:ss');
end UTL_DATASET_MAKE_NAME;
/* Сериализация описания параметров выборки для прогноза */
procedure UTL_FORECAST_RQ_MAKE_CFG
(
DBEG in date, -- Дата "С"
DEND in date, -- Дата "По"
NINTERVAL in number, -- Длина интервала (в днях, если меньше дня, то дробное - 1/24 для часа, например)
CRQ_CFG out clob -- Сериализованное описание параметров выборки для прогноза
)
is
XDOC integer; -- Курсор для XML
XRESULT PKG_XMAKE.TNODE; -- XML-документ
begin
/* Проверим параметры */
if (DBEG is null) then
P_EXCEPTION(0, 'Не указана дата начала выборки для прогноза.');
end if;
if (DEND is null) then
P_EXCEPTION(0, 'Не указана дата окончания выборки для прогноза.');
end if;
if ((NINTERVAL is null) or (NINTERVAL <= 0)) then
P_EXCEPTION(0,
'Не указана или указана неверно длина интервала измерений выборки для прогноза.');
end if;
/* Создаём документ */
XDOC := PKG_XMAKE.OPEN_CURSOR();
/* Формируем документ */
XRESULT := PKG_XMAKE.ELEMENT(ICURSOR => XDOC,
SNAME => 'XDATA',
RNODE00 => PKG_XMAKE.ELEMENT(ICURSOR => XDOC,
SNAME => 'DBEG',
RVALUE00 => PKG_XMAKE.VALUE(ICURSOR => XDOC, DVALUE => DBEG)),
RNODE01 => PKG_XMAKE.ELEMENT(ICURSOR => XDOC,
SNAME => 'DEND',
RVALUE00 => PKG_XMAKE.VALUE(ICURSOR => XDOC, DVALUE => DEND)),
RNODE02 => PKG_XMAKE.ELEMENT(ICURSOR => XDOC,
SNAME => 'NINTERVAL',
RVALUE00 => PKG_XMAKE.VALUE(ICURSOR => XDOC,
NVALUE => NINTERVAL)));
/* Сериализуем */
CRQ_CFG := PKG_XMAKE.SERIALIZE_TO_CLOB(ICURSOR => XDOC, ITYPE => PKG_XMAKE.CONTENT_, RNODE => XRESULT);
/* Освобождаем документ */
PKG_XMAKE.CLOSE_CURSOR(ICURSOR => XDOC);
end UTL_FORECAST_RQ_MAKE_CFG;
/* Десериализация описания параметров выборки для прогноза */
procedure UTL_FORECAST_RQ_PARSE_CFG
(
CRQ_CFG in clob, -- Сериализованное описание параметров выборки для прогноза
DBEG out date, -- Дата "С"
DEND out date, -- Дата "По"
NINTERVAL out number -- Длина интервала (в днях, если меньше дня, то дробное - 1/24 для часа, например)
)
is
XDOC PKG_XPATH.TDOCUMENT; -- XML-документ
XROOT PKG_XPATH.TNODE; -- Корневой элемент
begin
/* Разбираем документ */
XDOC := PKG_XPATH.PARSE_FROM_CLOB(LCXML => CRQ_CFG);
/* Находим корень */
XROOT := PKG_XPATH.ROOT_NODE(RDOCUMENT => XDOC);
/* Читаем параметры */
DBEG := PKG_XPATH.VALUE_DATE(RNODE => XROOT, SPATTERN => 'XDATA/DBEG');
DEND := PKG_XPATH.VALUE_DATE(RNODE => XROOT, SPATTERN => 'XDATA/DEND');
NINTERVAL := PKG_XPATH.VALUE_NUM(RNODE => XROOT, SPATTERN => 'XDATA/NINTERVAL');
/* Освобождаем документ */
PKG_XPATH.FREE(RDOCUMENT => XDOC);
end UTL_FORECAST_RQ_PARSE_CFG;
/* Считывание записи "Выборки данных оборудования" по регистрационному номеру */
function GET
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NRN in number -- Регистрационный номер
) return UDO_T_EQUIPDS%rowtype -- Запись выборки данных оборудования
is
RES UDO_T_EQUIPDS%rowtype; -- Буфер для результата
begin
/* Считывание записи */
begin
select T.* into RES from UDO_T_EQUIPDS T where T.RN = NRN;
exception
when NO_DATA_FOUND then
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => NFLAG_SMART, NDOCUMENT => NRN, SUNIT_TABLE => 'UDO_T_EQUIPDS');
end;
/* Возврат результата */
return RES;
end GET;
/* Поиск "Выборки данных оборудования" по мнемокоду */
procedure FIND_BY_CODE
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NCOMPANY in number, -- Организация
SCODE in varchar2, -- Мнемокод
NRN out number -- Регистрационный номер
)
is
begin
/* Поиск записи */
begin
select RN
into NRN
from UDO_T_EQUIPDS T
where T.COMPANY = NCOMPANY
and T.CODE = SCODE;
exception
when NO_DATA_FOUND then
P_EXCEPTION(NFLAG_SMART,
'Выборка данных оборудования "%s" не определёна.',
SCODE);
end;
end FIND_BY_CODE;
/* Базовое добавление "Выборки данных оборудования" */
procedure INS
(
NCOMPANY in number, -- Организация
SCODE in varchar2, -- Мнемокод
SNAME in varchar2, -- Наименование
NRN out number -- Регистрационный номер
)
is
begin
/* Формируем рег. номер */
NRN := GEN_ID();
/* Добавляем запись */
insert into UDO_T_EQUIPDS (RN, COMPANY, CODE, name) values (NRN, NCOMPANY, SCODE, SNAME);
end INS;
/* Базовое исправление "Выборки данных оборудования" */
procedure UPD
(
NRN in number, -- Регистрационный номер
NCOMPANY in number, -- Организация
SCODE in varchar2, -- Мнемокод
SNAME in varchar2 -- Наименование
)
is
begin
/* Исправим данные */
update UDO_T_EQUIPDS T
set T.CODE = SCODE,
T.NAME = SNAME
where T.RN = NRN
and T.COMPANY = NCOMPANY;
end UPD;
/* Базовое удаление "Выборки данных оборудования" */
procedure DEL
(
NRN in number, -- Регистрационный номер
NCOMPANY in number -- Организация
)
is
begin
/* Удалим запись */
delete from UDO_T_EQUIPDS T
where T.RN = NRN
and T.COMPANY = NCOMPANY;
end DEL;
/* Считывание записи "Выборки данных оборудования (классы оборудования)" по регистрационному номеру */
function CM_GET
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NRN in number -- Регистрационный номер
) return UDO_T_EQUIPDSCM%rowtype -- Запись класса оборудования выборки данных
is
RES UDO_T_EQUIPDSCM%rowtype; -- Буфер для результата
begin
/* Считывание записи */
begin
select T.* into RES from UDO_T_EQUIPDSCM T where T.RN = NRN;
exception
when NO_DATA_FOUND then
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => NFLAG_SMART, NDOCUMENT => NRN, SUNIT_TABLE => 'UDO_T_EQUIPDSCM');
end;
/* Возврат результата */
return RES;
end CM_GET;
/* Поиск "Выборки данных оборудования (классы оборудования)" по классу оборудования */
procedure CM_FIND_BY_EQOBJKIND
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NCOMPANY in number, -- Организация
SEQOBJKIND in varchar2, -- Класс оборудования (полный иерархический код)
NRN out number -- Регистрационный номер
)
is
NEQOBJKIND PKG_STD.TREF; -- Рег. номер класса оборудования
begin
/* Класс оборудования */
FIND_EQOBJKIND_FULLCODE(NFLAG_SMART => NFLAG_SMART,
NFLAG_OPTION => 0,
NCOMPANY => NCOMPANY,
SCODE => SEQOBJKIND,
NRN => NEQOBJKIND);
/* Поиск записи */
begin
select T.RN into NRN from UDO_T_EQUIPDSCM T where T.EQOBJKIND = NEQOBJKIND;
exception
when NO_DATA_FOUND then
P_EXCEPTION(NFLAG_SMART,
'Класс оборудования "%s" в выборках данных не определён.',
SEQOBJKIND);
end;
end CM_FIND_BY_EQOBJKIND;
/* Разыменование словарей "Выборки данных оборудования (классы оборудования)" */
procedure CM_JOINS
(
NCOMPANY in number, -- Организация
SEQOBJKIND in varchar2, -- Класс оборудования
SDICMUNTS in varchar2, -- Единица измерения выборки
SUSERPROCS_DATA in varchar2, -- Процедура формирования
SEXSSERVICE_UPLOAD in varchar2, -- Сервис обмена для выгрузки данных
SEXSSERVICEFN_UPLOAD in varchar2, -- Функция обмена для выгрузки данных
SEXSSERVICE_SEND_MD in varchar2, -- Сервис обмена для передачи внешней системе
SEXSSERVICEFN_SEND_MD in varchar2, -- Функция обмена для передачи внешней системе
SEXSSERVICE_SEND_MDCB in varchar2, -- Сервис обмена для приёма Call-back запросов с результатами передачи внешней системе
SEXSSERVICEFN_SEND_MDCB in varchar2, -- Функция сервиса обмена для приёма Call-back запросов с результатами передачи внешней системе
SEXSSERVICE_SEND_RQ in varchar2, -- Сервис обмена для обработки внешней системой
SEXSSERVICEFN_SEND_RQ in varchar2, -- Функция обмена для обработки внешней системой
SEXSSERVICE_SEND_RQCB in varchar2, -- Сервис обмена для приёма Call-back запросов с результатами обработки внешней системой
SEXSSERVICEFN_SEND_RQCB in varchar2, -- Функция обмена для приёма Call-back запросов с результатами обработки внешней системой
SEXSSERVICE_FRCST_MD in varchar2, -- Сервис обмена для публикации данных наработки оборудования при получении прогноза
SEXSSERVICEFN_FRCST_MD in varchar2, -- Функция обмена для публикации данных наработки оборудования при получении прогноза
NEQOBJKIND out number, -- Рег. номер класса оборудования
NDICMUNTS out number, -- Рег. номер единицы измерения выборки
NUSERPROCS_DATA out number, -- Рег. номер процедуры формирования
NEXSSERVICEFN_UPLOAD out number, -- Рег. номер функции обмена для выгрузки данных
NEXSSERVICEFN_SEND_MD out number, -- Рег. номер Функции обмена для передачи внешней системе
NEXSSERVICEFN_SEND_MDCB out number, -- Рег. номер call-back функции обмена для передачи внешней системе
NEXSSERVICEFN_SEND_RQ out number, -- Рег. номер функции обмена для обработки внешней системой
NEXSSERVICEFN_SEND_RQCB out number, -- Рег. номер call-back функции обмена для обработки внешней системой
NEXSSERVICEFN_FRCST_MD out number -- Рег. номер функции обмена для публикации данных наработки оборудования при получении прогноза
)
is
NEXSSERVICE PKG_STD.TREF; -- Рег. номер сервиса обмена
begin
/* Класс оборудования */
FIND_EQOBJKIND_FULLCODE(NFLAG_SMART => 0,
NFLAG_OPTION => 0,
NCOMPANY => NCOMPANY,
SCODE => SEQOBJKIND,
NRN => NEQOBJKIND);
/* Единица измерения */
FIND_DICMUNTS_CODE(NFLAG_SMART => 0,
NFLAG_OPTION => 0,
NCOMPANY => NCOMPANY,
SMEAS_MNEMO => SDICMUNTS,
NRN => NDICMUNTS);
/* Процедура формирования */
if (SUSERPROCS_DATA is not null) then
FIND_USERPROCS_CODE(NFLAG_SMART => 0, SCODE => SUSERPROCS_DATA, NRN => NUSERPROCS_DATA);
else
P_EXCEPTION(0, 'Не указана процедура формирования данных выборки.');
end if;
/* Функция обмена для выгрузки данных */
FIND_EXSSERVICE_CODE(NFLAG_SMART => 0, NFLAG_OPTION => 0, SCODE => SEXSSERVICE_UPLOAD, NRN => NEXSSERVICE);
FIND_EXSSERVICEFN_CODE(NFLAG_SMART => 0,
NFLAG_OPTION => 0,
NEXSSERVICE => NEXSSERVICE,
SCODE => SEXSSERVICEFN_UPLOAD,
NRN => NEXSSERVICEFN_UPLOAD);
/* Функция обмена для передачи внешней системе */
FIND_EXSSERVICE_CODE(NFLAG_SMART => 0, NFLAG_OPTION => 0, SCODE => SEXSSERVICE_SEND_MD, NRN => NEXSSERVICE);
FIND_EXSSERVICEFN_CODE(NFLAG_SMART => 0,
NFLAG_OPTION => 0,
NEXSSERVICE => NEXSSERVICE,
SCODE => SEXSSERVICEFN_SEND_MD,
NRN => NEXSSERVICEFN_SEND_MD);
/* Call-back функции обмена для передачи внешней системе */
FIND_EXSSERVICE_CODE(NFLAG_SMART => 0, NFLAG_OPTION => 0, SCODE => SEXSSERVICE_SEND_MDCB, NRN => NEXSSERVICE);
FIND_EXSSERVICEFN_CODE(NFLAG_SMART => 0,
NFLAG_OPTION => 0,
NEXSSERVICE => NEXSSERVICE,
SCODE => SEXSSERVICEFN_SEND_MDCB,
NRN => NEXSSERVICEFN_SEND_MDCB);
/* Функция обмена для обработки внешней системой */
FIND_EXSSERVICE_CODE(NFLAG_SMART => 0, NFLAG_OPTION => 0, SCODE => SEXSSERVICE_SEND_RQ, NRN => NEXSSERVICE);
FIND_EXSSERVICEFN_CODE(NFLAG_SMART => 0,
NFLAG_OPTION => 0,
NEXSSERVICE => NEXSSERVICE,
SCODE => SEXSSERVICEFN_SEND_RQ,
NRN => NEXSSERVICEFN_SEND_RQ);
/* Call-back функции обмена для обработки внешней системой */
FIND_EXSSERVICE_CODE(NFLAG_SMART => 0, NFLAG_OPTION => 0, SCODE => SEXSSERVICE_SEND_RQCB, NRN => NEXSSERVICE);
FIND_EXSSERVICEFN_CODE(NFLAG_SMART => 0,
NFLAG_OPTION => 0,
NEXSSERVICE => NEXSSERVICE,
SCODE => SEXSSERVICEFN_SEND_RQCB,
NRN => NEXSSERVICEFN_SEND_RQCB);
/* Функция обмена для публикации данных наработки оборудования при получении прогноза */
FIND_EXSSERVICE_CODE(NFLAG_SMART => 0, NFLAG_OPTION => 0, SCODE => SEXSSERVICE_FRCST_MD, NRN => NEXSSERVICE);
FIND_EXSSERVICEFN_CODE(NFLAG_SMART => 0,
NFLAG_OPTION => 0,
NEXSSERVICE => NEXSSERVICE,
SCODE => SEXSSERVICEFN_FRCST_MD,
NRN => NEXSSERVICEFN_FRCST_MD);
end CM_JOINS;
/* Базовые проверки целостности и корректности "Выборки данных оборудования (классы оборудования)" */
procedure CM_CHECK
(
SMODE in varchar2, -- 'I' - добавление, 'U' - исправление, 'D' - удаление
RREC in UDO_T_EQUIPDSCM%rowtype -- Запись с новыми значения класса оборудования выборки данных
)
is
/* Локальные переменные */
RREC_OLD UDO_T_EQUIPDSCM%rowtype; -- Предыдущие значения записи класса оборудования выборки данных
/* Считывание типа сервиса обмена */
function EXSSERVICE_TYPE
(
NEXSSERVICEFN in number -- Рег. номер функции обмена
) return number -- Тип сервиса обмена (см. константы PKG_EXS.NSRV_TYPE_*)
is
begin
/* Найдем тип серсива обмена */
for C in (select S.SRV_TYPE
from EXSSERVICE S,
EXSSERVICEFN F
where F.RN = NEXSSERVICEFN
and F.PRN = S.RN)
loop
/* Нашли - вернём */
return C.SRV_TYPE;
end loop;
/* Ничего не нашли */
return null;
end EXSSERVICE_TYPE;
/* Проверка типов сервисов обмена */
procedure EXSSERVICE_TYPE_CHECK
(
RREC in UDO_T_EQUIPDSCM%rowtype -- Проверяемая запись
)
is
begin
if (EXSSERVICE_TYPE(NEXSSERVICEFN => RREC.EXSSERVICEFN_UPLOAD) <> PKG_EXS.NSRV_TYPE_SEND) then
P_EXCEPTION(0,
'Функция обмена для выгрузки данных должна иметь тип "Отправка сообщений".');
end if;
if (EXSSERVICE_TYPE(NEXSSERVICEFN => RREC.EXSSERVICEFN_SEND_MD) <> PKG_EXS.NSRV_TYPE_SEND) then
P_EXCEPTION(0,
'Функция обмена для передачи данных внешней системе должна иметь тип "Отправка сообщений".');
end if;
if (EXSSERVICE_TYPE(NEXSSERVICEFN => RREC.EXSSERVICEFN_SEND_MDCB) <> PKG_EXS.NSRV_TYPE_RECIVE) then
P_EXCEPTION(0,
'Функция обмена для обратной связи о передаче данных внешней системе должна иметь тип "Приём сообщений".');
end if;
if (EXSSERVICE_TYPE(NEXSSERVICEFN => RREC.EXSSERVICEFN_SEND_RQ) <> PKG_EXS.NSRV_TYPE_SEND) then
P_EXCEPTION(0,
'Функция обмена для обработки внешней системой должна иметь тип "Отправка сообщений".');
end if;
if (EXSSERVICE_TYPE(NEXSSERVICEFN => RREC.EXSSERVICEFN_SEND_RQCB) <> PKG_EXS.NSRV_TYPE_RECIVE) then
P_EXCEPTION(0,
'Функция обмена для обратной связи об обработке внешней системой должна иметь тип "Приём сообщений".');
end if;
if (EXSSERVICE_TYPE(NEXSSERVICEFN => RREC.EXSSERVICEFN_FRCST_MD) <> PKG_EXS.NSRV_TYPE_RECIVE) then
P_EXCEPTION(0,
'Функция обмена для публикации данных наработки оборудования при получении прогноза должна иметь тип "Приём сообщений".');
end if;
end EXSSERVICE_TYPE_CHECK;
begin
/* Работаем от режима */
case SMODE
/* Добавление */
when 'I' then
begin
/* Проверим корректность типов серсовисов обмена */
EXSSERVICE_TYPE_CHECK(RREC => RREC);
end;
/* Исправление */
when 'U' then
begin
/* Считывание текущей записи */
RREC_OLD := CM_GET(NFLAG_SMART => 0, NRN => RREC.RN);
/* Если изменяются кличевые атрибуты, влияющие на выборку */
if ((RREC.EQOBJKIND <> RREC_OLD.EQOBJKIND) or (RREC.DICMUNTS <> RREC_OLD.DICMUNTS)) then
/* Проверим отсутствие файлов данных */
for C in (select T.RN from UDO_T_EQUIPDSCMFL T where T.PRN = RREC.RN)
loop
/* Они есть - изменения недопустимы */
P_EXCEPTION(0,
'Изменение ключевых атрибутов ("Класс оборудования", "Единица измерения выборки") недопустимо - для данного класса оборудования уже зарегистрированы файлы данных.');
end loop;
end if;
/* Проверим корректность типов серсовисов обмена */
EXSSERVICE_TYPE_CHECK(RREC => RREC);
end;
/* Удаление */
when 'D' then
begin
/* Специальных проверок нет, проверки на возможность удаления файлов и моделей класса оборудования запустятся автоматически при их удалении по связям */
null;
end;
/* Неизвестный режим работы */
else
P_EXCEPTION(0, 'Режим проверки "%s" не поддерживается.', SMODE);
end case;
end CM_CHECK;
/* Базовое добавление "Выборки данных оборудования (классы оборудования)" */
procedure CM_INS
(
NPRN in number, -- Родитель
NEQOBJKIND in number, -- Класс оборудования
NDICMUNTS in number, -- Единица измерения выборки
NUSERPROCS_DATA in number, -- Процедура формирования
NEXSSERVICEFN_UPLOAD in number, -- Функция обмена для выгрузки данных
NEXSSERVICEFN_SEND_MD in number, -- Функция обмена для передачи внешней системе
NEXSSERVICEFN_SEND_MDCB in number, -- Call-back функции обмена для передачи внешней системе
NEXSSERVICEFN_SEND_RQ in number, -- Функция обмена для обработки внешней системой
NEXSSERVICEFN_SEND_RQCB in number, -- Call-back функции обмена для обработки внешней системой
NEXSSERVICEFN_FRCST_MD in number, -- Функция обмена для публикации данных наработки оборудования при получении прогноза
NRN out number -- Регистрационный номер
)
is
RREC UDO_T_EQUIPDSCM%rowtype; -- Запись с новыми значениями для проверки
begin
/* Соберём запись */
RREC.PRN := NPRN;
RREC.EQOBJKIND := NEQOBJKIND;
RREC.DICMUNTS := NDICMUNTS;
RREC.USERPROCS_DATA := NUSERPROCS_DATA;
RREC.EXSSERVICEFN_UPLOAD := NEXSSERVICEFN_UPLOAD;
RREC.EXSSERVICEFN_SEND_MD := NEXSSERVICEFN_SEND_MD;
RREC.EXSSERVICEFN_SEND_MDCB := NEXSSERVICEFN_SEND_MDCB;
RREC.EXSSERVICEFN_SEND_RQ := NEXSSERVICEFN_SEND_RQ;
RREC.EXSSERVICEFN_SEND_RQCB := NEXSSERVICEFN_SEND_RQCB;
RREC.EXSSERVICEFN_FRCST_MD := NEXSSERVICEFN_FRCST_MD;
/* Проверим возможность исполнения */
CM_CHECK(SMODE => 'I', RREC => RREC);
/* Формируем рег. номер */
NRN := GEN_ID();
/* Добавляем запись */
insert into UDO_T_EQUIPDSCM
(RN,
PRN,
EQOBJKIND,
DICMUNTS,
DATA_CONFIG,
USERPROCS_DATA,
EXSSERVICEFN_UPLOAD,
EXSSERVICEFN_SEND_MD,
EXSSERVICEFN_SEND_MDCB,
EXSSERVICEFN_SEND_RQ,
EXSSERVICEFN_SEND_RQCB,
EXSSERVICEFN_FRCST_MD)
values
(NRN,
NPRN,
NEQOBJKIND,
NDICMUNTS,
null,
NUSERPROCS_DATA,
NEXSSERVICEFN_UPLOAD,
NEXSSERVICEFN_SEND_MD,
NEXSSERVICEFN_SEND_MDCB,
NEXSSERVICEFN_SEND_RQ,
NEXSSERVICEFN_SEND_RQCB,
NEXSSERVICEFN_FRCST_MD);
end CM_INS;
/* Базовое исправление "Выборки данных оборудования (классы оборудования)" */
procedure CM_UPD
(
NRN in number, -- Регистрационный номер
NEQOBJKIND in number, -- Класс оборудования
NDICMUNTS in number, -- Единица измерения выборки
NUSERPROCS_DATA in number, -- Процедура формирования
NEXSSERVICEFN_UPLOAD in number, -- Функция обмена для выгрузки данных
NEXSSERVICEFN_SEND_MD in number, -- Функция обмена для передачи внешней системе
NEXSSERVICEFN_SEND_MDCB in number, -- Call-back функции обмена для передачи внешней системе
NEXSSERVICEFN_SEND_RQ in number, -- Функция обмена для обработки внешней системой
NEXSSERVICEFN_SEND_RQCB in number, -- Call-back функции обмена для обработки внешней системой
NEXSSERVICEFN_FRCST_MD in number -- Функция обмена для публикации данных наработки оборудования при получении прогноза
)
is
RREC UDO_T_EQUIPDSCM%rowtype; -- Запись с новыми значениями для проверки
begin
/* Соберём запись */
RREC := CM_GET(NFLAG_SMART => 0, NRN => NRN);
RREC.EQOBJKIND := NEQOBJKIND;
RREC.DICMUNTS := NDICMUNTS;
RREC.USERPROCS_DATA := NUSERPROCS_DATA;
RREC.EXSSERVICEFN_UPLOAD := NEXSSERVICEFN_UPLOAD;
RREC.EXSSERVICEFN_SEND_MD := NEXSSERVICEFN_SEND_MD;
RREC.EXSSERVICEFN_SEND_MDCB := NEXSSERVICEFN_SEND_MDCB;
RREC.EXSSERVICEFN_SEND_RQ := NEXSSERVICEFN_SEND_RQ;
RREC.EXSSERVICEFN_SEND_RQCB := NEXSSERVICEFN_SEND_RQCB;
RREC.EXSSERVICEFN_FRCST_MD := NEXSSERVICEFN_FRCST_MD;
/* Проверим возможность исполнения */
CM_CHECK(SMODE => 'U', RREC => RREC);
/* Исправим данные */
update UDO_T_EQUIPDSCM T
set T.EQOBJKIND = NEQOBJKIND,
T.DICMUNTS = NDICMUNTS,
T.USERPROCS_DATA = NUSERPROCS_DATA,
T.EXSSERVICEFN_UPLOAD = NEXSSERVICEFN_UPLOAD,
T.EXSSERVICEFN_SEND_MD = NEXSSERVICEFN_SEND_MD,
T.EXSSERVICEFN_SEND_MDCB = NEXSSERVICEFN_SEND_MDCB,
T.EXSSERVICEFN_SEND_RQ = NEXSSERVICEFN_SEND_RQ,
T.EXSSERVICEFN_SEND_RQCB = NEXSSERVICEFN_SEND_RQCB,
T.EXSSERVICEFN_FRCST_MD = NEXSSERVICEFN_FRCST_MD
where T.RN = NRN;
end CM_UPD;
/* Базовое удаление "Выборки данных оборудования (классы оборудования)" */
procedure CM_DEL
(
NRN in number -- Регистрационный номер
)
is
RREC UDO_T_EQUIPDSCM%rowtype; -- Запись с новыми значениями для проверки
begin
/* Соберём запись */
RREC := CM_GET(NFLAG_SMART => 0, NRN => NRN);
/* Проверим возможность исполнения */
CM_CHECK(SMODE => 'D', RREC => RREC);
/* Удалим файлы */
for C in (select T.RN from UDO_T_EQUIPDSCMFL T where T.PRN = NRN)
loop
CMFL_DEL(NRN => C.RN);
end loop;
/* Удалим модели */
for C in (select T.RN from UDO_T_EQUIPDSCMML T where T.PRN = NRN)
loop
CMML_DEL(NRN => C.RN);
end loop;
/* Удалим запись */
delete from UDO_T_EQUIPDSCM T where T.RN = NRN;
end CM_DEL;
/* Базовая установка описания структуры выборки "Выборки данных оборудования (классы оборудования)" */
procedure CM_SET_DATA_CONFIG
(
NRN in number, -- Регистрационный номер
BDATA_CONFIG in clob -- Описание структуры выборки
)
is
begin
/* Установим описание структуры выборки */
update UDO_T_EQUIPDSCM T set T.DATA_CONFIG = BDATA_CONFIG where T.RN = NRN;
end CM_SET_DATA_CONFIG;
/* Считывание записи "Выборки данных оборудования (классы оборудования, файлы данных)" по регистрационному номеру */
function CMFL_GET
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NRN in number -- Регистрационный номер
) return UDO_T_EQUIPDSCMFL%rowtype -- Запись файла данных класса оборудования выборки данных
is
RES UDO_T_EQUIPDSCMFL%rowtype; -- Буфер для результата
begin
/* Считывание записи */
begin
select T.* into RES from UDO_T_EQUIPDSCMFL T where T.RN = NRN;
exception
when NO_DATA_FOUND then
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => NFLAG_SMART, NDOCUMENT => NRN, SUNIT_TABLE => 'UDO_T_EQUIPDSCMFL');
end;
/* Возврат результата */
return RES;
end CMFL_GET;
/* Базовое добавление "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_INS
(
NPRN in number, -- Родитель
SFILE_NAME in varchar2, -- Имя файла
SDESCR in varchar2, -- Описание
BDATASET in blob, -- Данные выборки
NDATASET_ID in number, -- Идентификатор данных
DDATASET_TS in date, -- Время формирования данных
NRN out number -- Регистрационный номер
)
is
begin
/* Формируем рег. номер */
NRN := GEN_ID();
/* Добавляем запись */
insert into UDO_T_EQUIPDSCMFL
(RN, PRN, FILE_NAME, DESCR, QUEUE_ID, STATUS, ERR, DATASET, DATASET_ID, DATASET_TS)
values
(NRN, NPRN, SFILE_NAME, SDESCR, null, NCMFL_STATUS_REGISTERED, null, BDATASET, NDATASET_ID, DDATASET_TS);
end CMFL_INS;
/* Базовое удаление "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_DEL
(
NRN in number -- Регистрационный номер
)
is
RREC UDO_T_EQUIPDSCMFL%rowtype; -- Обрабатываемая запись
begin
/* Считаем запись */
RREC := CMFL_GET(NFLAG_SMART => 0, NRN => NRN);
/* Можно удалять только в статусах: зарегистрирован, успешно загружен на сервер, ошибка загрузки на сервер, успешно загружен во внешнюю систему, при загрузке во внешнюю систему произошла ошибка */
if (RREC.STATUS not in (NCMFL_STATUS_REGISTERED,
NCMFL_STATUS_UPLOADED,
NCMFL_STATUS_UPLOAD_ERR,
NCMFL_STATUS_SENT,
NCMFL_STATUS_SEND_ERR)) then
P_EXCEPTION(0, 'Файл данных обрабатывается, удаление невозможно.');
end if;
/* Проверим, что нет связанных обученных/обучающихся моделей, иначе - сначала следует удалить модель вручную */
for C in (select T.RN
from UDO_T_EQUIPDSCMML T
where T.DATASET_ID = RREC.DATASET_ID
and T.STATUS <> NCMML_STATUS_REGISTERED)
loop
P_EXCEPTION(0,
'Файлы имеют связанные модели, находящиеся в состоянии отличном от "Зарегистрирована". Сначала необходимо удалить их.');
end loop;
/* Попробуем удалить связанные модели */
for C in (select T.RN from UDO_T_EQUIPDSCMML T where T.DATASET_ID = RREC.DATASET_ID)
loop
CMML_DEL(NRN => C.RN);
end loop;
/* Удалим запись */
delete from UDO_T_EQUIPDSCMFL T where T.RN = NRN;
end CMFL_DEL;
/* Базовая установка имени файла "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_SET_FILE_NAME
(
NRN in number, -- Регистрационный номер
SFILE_NAME in varchar2 -- Имя файла
)
is
begin
/* Установим имя файла */
update UDO_T_EQUIPDSCMFL T set T.FILE_NAME = SFILE_NAME where T.RN = NRN;
end CMFL_SET_FILE_NAME;
/* Базовая установка состояния "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_SET_STATUS
(
NRN in number, -- Регистрационный номер
NSTATUS in number, -- Состояние (см. константы NCMFL_STATUS_*)
SQUEUE_ID in varchar2 := null, -- Идентификатор очереди обработки
SERR in varchar2 := null -- Сообщение об ошибке
)
is
SQUEUE_ID_ PKG_STD.TSTRING := SQUEUE_ID; -- Буфер для идентификатора очереди обработки
SERR_ PKG_STD.TSTRING := SERR; -- Буфер для сообщения об ошибке
begin
/* Проверим идентификатор очереди */
if ((NSTATUS in (NCMFL_STATUS_SENDING, NCMFL_STATUS_SENT)) and (SQUEUE_ID_ is null)) then
P_EXCEPTION(0,
'Идентификатор очереди обработки обязателен для перевода файла данных в состояния "Загружается во внешнюю систему", "Успешно загружен во внешнюю систему".');
end if;
/* Проверим сообщение об ошибке */
if ((NSTATUS in (NCMFL_STATUS_UPLOAD_ERR, NCMFL_STATUS_SEND_ERR)) and (SERR_ is null)) then
P_EXCEPTION(0,
'Текст сообщения об ошибке обязателен для перевода файла данных в состояния "Ошибка загрузки на сервер", "Ошибка загрузки во внешнюю систему".');
end if;
/* Удалим идентификатор очереди обработки и сообщение об ошибке для тех статусов, где они не нужны */
if (NSTATUS not in (NCMFL_STATUS_SENDING, NCMFL_STATUS_SENT)) then
SQUEUE_ID_ := null;
end if;
if (NSTATUS not in (NCMFL_STATUS_UPLOAD_ERR, NCMFL_STATUS_SEND_ERR)) then
SERR_ := null;
end if;
/* Установим состояние и сопутствующие ему атрибуты */
update UDO_T_EQUIPDSCMFL T
set T.STATUS = NSTATUS,
T.QUEUE_ID = SQUEUE_ID_,
T.ERR = SERR_
where T.RN = NRN;
end CMFL_SET_STATUS;
/* Считывание записи "Выборки данных оборудования (классы оборудования, модели)" по регистрационному номеру */
function CMML_GET
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NRN in number -- Регистрационный номер
) return UDO_T_EQUIPDSCMML%rowtype -- Запись модели класса оборудования выборки данных
is
RES UDO_T_EQUIPDSCMML%rowtype; -- Буфер для результата
begin
/* Считывание записи */
begin
select T.* into RES from UDO_T_EQUIPDSCMML T where T.RN = NRN;
exception
when NO_DATA_FOUND then
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => NFLAG_SMART, NDOCUMENT => NRN, SUNIT_TABLE => 'UDO_T_EQUIPDSCMML');
end;
/* Возврат результата */
return RES;
end CMML_GET;
/* Поиск "Выборки данных оборудования (классы оборудования, модели)" по задаче */
procedure CMML_FIND_BY_TASK
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NPRN in number, -- Родитель
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*)
NRN out number -- Регистрационный номер
)
is
begin
/* Поиск записи */
begin
select T.RN
into NRN
from UDO_T_EQUIPDSCMML T
where T.PRN = NPRN
and T.TASK = STASK;
exception
when NO_DATA_FOUND then
P_EXCEPTION(NFLAG_SMART,
'Модель с задачей "%s" в классе оборудования "%s" не определёна.',
STASK,
TO_CHAR(NPRN));
end;
end CMML_FIND_BY_TASK;
/* Разыменование словарей "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_JOINS
(
SUSERPROCS_FRCST_DATA in varchar2, -- Пользовательская процедура формирования данных для прогноза
NUSERPROCS_FRCST_DATA out number -- Рег. номер пользовательской процедуры формирования данных для прогноза
)
is
begin
/* Процедура формирования данных для прогноза */
if (SUSERPROCS_FRCST_DATA is not null) then
FIND_USERPROCS_CODE(NFLAG_SMART => 0, SCODE => SUSERPROCS_FRCST_DATA, NRN => NUSERPROCS_FRCST_DATA);
else
P_EXCEPTION(0,
'Не указана процедура формирования данных для прогноза.');
end if;
end CMML_JOINS;
/* Базовое добавление "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_INS
(
NPRN in number, -- Родитель
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*)
NDATASET_ID in number, -- Идентификатор выборки
NUSERPROCS_FRCST_DATA in number, -- Рег. номер пользовательской процедуры формирования данных для прогноза
NRN out number -- Регистрационный номер
)
is
NCNT PKG_STD.TNUMBER; -- Счетчик файлов данных выборки
begin
/* Проверим наличие идентификатора выборки в файлах данных */
begin
select count(T.RN)
into NCNT
from UDO_T_EQUIPDSCMFL T
where T.PRN = NPRN
and T.DATASET_ID = NDATASET_ID;
exception
when others then
P_EXCEPTION(0,
'Не удалось проверить корректность идентификатора выборки.');
end;
if (NCNT = 0) then
P_EXCEPTION(0,
'Неверно указан идентификатор выборки (%s).',
COALESCE(TO_CHAR(NDATASET_ID), '<НЕ УКАЗАН>'));
end if;
/* Формируем рег. номер */
NRN := GEN_ID();
/* Добавляем запись */
insert into UDO_T_EQUIPDSCMML
(RN, PRN, TASK, PRECISION, QUEUE_ID, STATUS, ERR, DATASET_ID, USERPROCS_FRCST_DATA)
values
(NRN, NPRN, STASK, null, null, NCMML_STATUS_REGISTERED, null, NDATASET_ID, NUSERPROCS_FRCST_DATA);
end CMML_INS;
/* Базовое исправление "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_UPD
(
NRN in number, -- Регистрационный номер
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*)
NUSERPROCS_FRCST_DATA in number -- Рег. номер пользовательской процедуры формирования данных для прогноза
)
is
RREC UDO_T_EQUIPDSCMML%rowtype; -- Обрабатываемая запись
begin
/* Считаем запись */
RREC := CMML_GET(NFLAG_SMART => 0, NRN => NRN);
/* Можно изменять только в статусах: зарегистрирована, при обработке внешней системой произошла ошибка */
if (RREC.STATUS not in (NCMML_STATUS_REGISTERED, NCMML_STATUS_PROCESS_ERR)) then
P_EXCEPTION(0,
'Модель обрабатывается или уже успешно обработана, изменение невозможно.');
end if;
/* Исправим данные */
update UDO_T_EQUIPDSCMML T
set T.TASK = STASK,
T.USERPROCS_FRCST_DATA = NUSERPROCS_FRCST_DATA
where T.RN = NRN;
end CMML_UPD;
/* Базовое удаление "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_DEL
(
NRN in number -- Регистрационный номер
)
is
RREC UDO_T_EQUIPDSCMML%rowtype; -- Обрабатываемая запись
begin
/* Считаем запись */
RREC := CMML_GET(NFLAG_SMART => 0, NRN => NRN);
/* Можно удалять только в статусах: зарегистрирована, успешно обработана внешней системой, при обработке внешней системой произошла ошибка */
if (RREC.STATUS not in (NCMML_STATUS_REGISTERED, NCMML_STATUS_PROCESSED, NCMML_STATUS_PROCESS_ERR)) then
P_EXCEPTION(0, 'Модель обрабатывается, удаление невозможно.');
end if;
/* Удалим историю */
for C in (select T.RN from UDO_T_EQUIPDSCMMLH T where T.PRN = NRN)
loop
CMMLH_DEL(NRN => C.RN);
end loop;
/* Удалим запись */
delete from UDO_T_EQUIPDSCMML T where T.RN = NRN;
end CMML_DEL;
/* Базовая установка точности "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_SET_PRECISION
(
NRN in number, -- Регистрационный номер
NPRECISION in number -- Точность
)
is
begin
/* Установим точность */
update UDO_T_EQUIPDSCMML T set T.PRECISION = NPRECISION where T.RN = NRN;
end CMML_SET_PRECISION;
/* Базовая установка состояния "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_SET_STATUS
(
NRN in number, -- Регистрационный номер
NSTATUS in number, -- Состояние (см. константы NCMML_STATUS_*)
SQUEUE_ID in varchar2 := null, -- Идентификатор очереди обработки
SERR in varchar2 := null -- Сообщение об ошибке
)
is
SQUEUE_ID_ PKG_STD.TSTRING := SQUEUE_ID; -- Буфер для идентификатора очереди обработки
SERR_ PKG_STD.TSTRING := SERR; -- Буфер для сообщения об ошибке
begin
/* Проверим идентификатор очереди */
if ((NSTATUS in (NCMML_STATUS_PROCESSING, NCMML_STATUS_PROCESSED)) and (SQUEUE_ID_ is null)) then
P_EXCEPTION(0,
'Идентификатор очереди обработки обязателен для перевода модели в состояния "Обрабатывается внешней системой", "Успешно обработана внешней системой".');
end if;
/* Проверим сообщение об ошибке */
if ((NSTATUS in (NCMML_STATUS_PROCESS_ERR)) and (SERR_ is null)) then
P_EXCEPTION(0,
'Текст сообщения об ошибке обязателен для перевода модели в состояние "Ошибка обработки внешней системой".');
end if;
/* Удалим идентификатор очереди обработки и сообщение об ошибке для тех статусов, где они не нужны */
if (NSTATUS not in (NCMML_STATUS_PROCESSING, NCMML_STATUS_PROCESSED)) then
SQUEUE_ID_ := null;
end if;
if (NSTATUS not in (NCMML_STATUS_PROCESS_ERR)) then
SERR_ := null;
end if;
/* Установим состояние и сопутствующие ему атрибуты */
update UDO_T_EQUIPDSCMML T
set T.STATUS = NSTATUS,
T.QUEUE_ID = SQUEUE_ID_,
T.ERR = SERR_
where T.RN = NRN;
end CMML_SET_STATUS;
/* Формирование наименования для задачи "Выборки данных оборудования (классы оборудования, модели)" */
function CMML_TASK_NAME
(
STASK in varchar2 -- Задача (см. константы SCMML_TASK_*)
) return varchar2 -- Наименование задачи
is
begin
case STASK
when SCMML_TASK_TCF then
return 'Оценка технического состояния';
when SCMML_TASK_RUL then
return 'Прогноз остаточного ресурса';
when SCMML_TASK_FP then
return 'Прогноз отказа';
else
return 'Вид задачи оценки не поддерживается';
end case;
end CMML_TASK_NAME;
/* Формирование подсказки для задачи "Выборки данных оборудования (классы оборудования, модели)" */
function CMML_TASK_HINT
return varchar2 -- Подсказка для задачи
is
begin
return '<b>TCF</b> - ' || CMML_TASK_NAME(STASK => SCMML_TASK_TCF) || ' (<b>T</b>echnical <b>C</b>ondition <b>F</b>orecast)<br>' ||
'<b>RUL</b> - ' || CMML_TASK_NAME(STASK => SCMML_TASK_RUL) || ' (<b>R</b>emaining <b>U</b>seful <b>L</b>ife)<br>' ||
'<b>FP</b> - ' || CMML_TASK_NAME(STASK => SCMML_TASK_FP) || ' (<b>F</b>ailure <b>P</b>redict)';
end CMML_TASK_HINT;
/* Формирование подсказки для процедуры формирования данных для прогноза "Выборки данных оборудования (классы оборудования, модели)" */
function CMML_USERPROCS_FRCST_DATA_HINT
return varchar2 -- Подсказка для процедуры формирования данных для прогноза
is
begin
return 'Пользовательская процедура формирования данных для прогноза. Будет вызвана при запросе прогоза у модели.<br>' ||
'Должна иметь <b>входной параметр "NEQCONFIG"</b> - в него при вызове будет передан рег. номер единицы оборудования.<br>' ||
'Должна возвращать <b>выходные параметры "NDATASET_IDENT", "NDATASET_CONFIG_IDENT" и "NREQUEST_CONFIG_IDENT"</b> - ' ||
'идентификаторы файлового буфера с подготовленными данными (CSV), описанием структуры данных (XML) и описанием параметров запроса (XML) для интерпретации прогноза соответственно.';
end CMML_USERPROCS_FRCST_DATA_HINT;
/* Считывание записи "Выборки данных оборудования (классы оборудования, модели, история запросов)" по регистрационному номеру */
function CMMLH_GET
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NRN in number -- Регистрационный номер
) return UDO_T_EQUIPDSCMMLH%rowtype -- Запись итории прогонозов модели
is
RES UDO_T_EQUIPDSCMMLH%rowtype; -- Буфер для результата
begin
/* Считывание записи */
begin
select T.* into RES from UDO_T_EQUIPDSCMMLH T where T.RN = NRN;
exception
when NO_DATA_FOUND then
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => NFLAG_SMART, NDOCUMENT => NRN, SUNIT_TABLE => 'UDO_T_EQUIPDSCMMLH');
end;
/* Возврат результата */
return RES;
end CMMLH_GET;
/* Базовое добавление "Выборки данных оборудования (классы оборудования, модели, история запросов)" */
procedure CMMLH_INS
(
NPRN in number, -- Родитель
NEQCONFIG in number, -- Рег. номер технического объекта
SRQ_AUTHID in varchar2, -- Пользователь, выполнивший запрос
DRQ_DATE in date, -- Дата/время запроса
BRQ in blob, -- Параметры запроса
NRN out number -- Регистрационный номер
)
is
begin
/* Формируем рег. номер */
NRN := GEN_ID();
/* Добавляем запись */
insert into UDO_T_EQUIPDSCMMLH
(RN, PRN, EQCONFIG, RQ_AUTHID, RQ_DATE, RQ, FORECAST, FORECAST_DATE, FORECAST_DAYS)
values
(NRN, NPRN, NEQCONFIG, SRQ_AUTHID, DRQ_DATE, BRQ, null, null, null);
end CMMLH_INS;
/* Базовое удаление "Выборки данных оборудования (классы оборудования, модели, история запросов)" */
procedure CMMLH_DEL
(
NRN in number -- Регистрационный номер
)
is
begin
/* Удалим запись */
delete from UDO_T_EQUIPDSCMMLH T where T.RN = NRN;
end CMMLH_DEL;
/* Базовая установка данных прогноза "Выборки данных оборудования (классы оборудования, файлы данных, история запросов)" */
procedure CMMLH_SET_FORECAST
(
NRN in number, -- Регистрационный номер
BFORECAST in blob, -- Данные прогноза
DFORECAST_DATE in date, -- Дата прогноза
NFORECAST_DAYS in number -- Прогноз (дней до выхода из строя на дату прогноза)
)
is
begin
/* Установим данные прогноза */
update UDO_T_EQUIPDSCMMLH T
set T.FORECAST = BFORECAST,
T.FORECAST_DATE = DFORECAST_DATE,
T.FORECAST_DAYS = NFORECAST_DAYS
where T.RN = NRN;
end CMMLH_SET_FORECAST;
/* Вычисление количества дней до выхода из строя от даты */
function CMMLH_FORECAST_DAYS_NOW
(
DFORECAST_DATE in date, -- Дата прогноза
NFORECAST_DAYS in number, -- RUL-прогноз (дней до перехода в предельное состояние от даты прогноза)
DDATE in date := sysdate -- Дата (не задана - текущая)
) return number -- Количество дней до выхода из строя
is
NRES PKG_STD.TNUMBER; -- Буфер для результата
begin
/* От прогнозной даты выхода из строя (дата прогноза + дней до перехода в предельное состояние от неё) отнимем текущую дату */
NRES := ROUND((DFORECAST_DATE + NFORECAST_DAYS) - COALESCE(DDATE, sysdate));
/* Если дело прошлое - скажем, что осталось 0 дней */
if (NRES < 0) then
NRES := 0;
end if;
/* Вренём результат */
return NRES;
end CMMLH_FORECAST_DAYS_NOW;
/* Вычисление вероятности выхода из строя на дату по RUL-прогнозу */
/*
Описание алгоритма:
Считаем, что остаточный ресурс "k" - случайная величина, имеющая равномерную функцию распределения на интервале [a, b]
Необходимо определить вероятность того, что остаточный ресурс составит не менее "m" дней (P(k>=m)).
Здесь:
"k" - остаточный ресурс
"m" - количество дней, от текущего, до проверяемой даты (DDATE)
"a" - текущий день, 0
"b" - количество дней от текущего, до даты выхода из строя (DFORECAST_DATE + NFORECAST_DAYS), спрогнозированной фреймворком
Таким образом:
- вычисления невозможны, если хоть один из входных параметров неопределён, будем возвращать null
- если дата выхода из строя (DFORECAST_DATE + NFORECAST_DAYS) меньше текущей (т.е. b < a и интервал распределения неопределён), то считаем, что ресурс гарантировано меньше (P(k>=m) = 1)
- если проверяемая дата (DDATE) меньше текущей (т.е. не левее [a, b]) - вероятность 0, ресурс гарантировано больше (P(k>=m) = 0)
- если проверяемая дата (DDATE) больше даты выхода из строя (т.е. правее [a, b]) - вероятность 1, ресурс гарантировано меньше (P(k>=m) = 1)
- если проверяемая дата (DDATE) в диапазоне от текущей, до предсказанной даты выхода из строя (в [a, b]), то P(k>=m) = 1 - ((b - m)/(b - a))
*/
function CMMLH_RUL_BREAKDOWN_PROB
(
DFORECAST_DATE in date, -- Дата прогноза
NFORECAST_DAYS in number, -- RUL-прогноз (дней до перехода в предельное состояние от даты прогноза)
DDATE in date -- Дата на
) return number -- Значение вероятности
is
DFORECAST_BREAKDOWN PKG_STD.TLDATE; -- Прогнозная дата выхода из строя
NB PKG_STD.TNUMBER; -- Правая граница диапазона распределения вероятности (количество дней от текущего до прогнозной даты выхода из строя)
NM PKG_STD.TNUMBER; -- Проверяемый аргумент (количество дней от текущего до проверяемой даты)
NRES PKG_STD.TNUMBER; -- Буфер для результата
begin
/* Проверим параметры - должны быть заданы все параметры */
if ((NFORECAST_DAYS is null) or (DFORECAST_DATE is null) or (DDATE is null)) then
return null;
end if;
/* Вычислим дату выхода из строя */
DFORECAST_BREAKDOWN := DFORECAST_DATE + NFORECAST_DAYS;
/* Если прогнозируемая дата выхода из строя меньше текущей - ресурс гарантировано ниже */
if (DFORECAST_BREAKDOWN < sysdate) then
return 100;
end if;
/* Если проверяемя дата меньше текущей - ресурс гарантировано выше */
if (DDATE < sysdate) then
return 0;
end if;
/* Если проверяемя дата больше прогнозной дты выхода из строя - ресурс гарантировано ниже */
if (DDATE > DFORECAST_BREAKDOWN) then
return 100;
end if;
/* Вычисляем */
NB := DFORECAST_BREAKDOWN - sysdate;
NM := DDATE - sysdate;
NRES := 100 - ROUND(((NB - NM) / NB) * 100);
/* Возвращаем результат */
return NRES;
end CMMLH_RUL_BREAKDOWN_PROB;
end UDO_PKG_EQUIPDS_BASE;
/