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 'TCF - ' || CMML_TASK_NAME(STASK => SCMML_TASK_TCF) || ' (Technical Condition Forecast)
' || 'RUL - ' || CMML_TASK_NAME(STASK => SCMML_TASK_RUL) || ' (Remaining Useful Life)
' || 'FP - ' || CMML_TASK_NAME(STASK => SCMML_TASK_FP) || ' (Failure Predict)'; end CMML_TASK_HINT; /* Формирование подсказки для процедуры формирования данных для прогноза "Выборки данных оборудования (классы оборудования, модели)" */ function CMML_USERPROCS_FRCST_DATA_HINT return varchar2 -- Подсказка для процедуры формирования данных для прогноза is begin return 'Пользовательская процедура формирования данных для прогноза. Будет вызвана при запросе прогоза у модели.
' || 'Должна иметь входной параметр "NEQCONFIG" - в него при вызове будет передан рег. номер единицы оборудования.
' || 'Должна возвращать выходные параметры "NDATASET_IDENT", "NDATASET_CONFIG_IDENT" и "NREQUEST_CONFIG_IDENT" - ' || 'идентификаторы файлового буфера с подготовленными данными (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; /