1491 lines
90 KiB
SQL
1491 lines
90 KiB
SQL
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;
|
||
/
|