From a895096dea7c00f272e8e21e12c97904db8bb9b8 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Tue, 1 Apr 2025 15:43:45 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D1=86=D0=B5=D0=B4=D1=83?= =?UTF-8?q?=D1=80=D0=B0=20=D0=BF=D1=83=D0=B1=D0=BB=D0=B8=D0=BA=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B3=D0=BD=D0=BE=D0=B7?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/UDO_PKG_EQUIPDS_EXS.pck | 69 ++++++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 6 deletions(-) diff --git a/db/UDO_PKG_EQUIPDS_EXS.pck b/db/UDO_PKG_EQUIPDS_EXS.pck index 7df0ac9..55e6323 100644 --- a/db/UDO_PKG_EQUIPDS_EXS.pck +++ b/db/UDO_PKG_EQUIPDS_EXS.pck @@ -124,6 +124,13 @@ is NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена ); + /* Публикация выборки для прогоноза */ + procedure P_FORECAST_DATA + ( + NIDENT in number, -- Идентификатор процесса + NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена + ); + /* Инициализация настроек расширения для интеграции с фреймворк по прогнозированию ресурса оборудования */ procedure INIT_EQUIPDS ( @@ -391,7 +398,7 @@ is NSTATUS PKG_STD.tNUMBER; -- состояния "Выборки данных оборудования (классы оборудования, файлы данных)" SERR PKG_STD.tSTRING; -- Текст ошибки SQUEUE_ID PKG_STD.tSTRING; -- Идентификатор очереди обработки - NPRECISION_F PKG_STD.tNUMBER; -- Точность Модели (факт) + NPRECISION PKG_STD.tNUMBER; -- Точность модели begin /* Поиск записи очереди обмена */ REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE); @@ -405,11 +412,11 @@ is SPATH => 'message'); SQUEUE_ID := PKG_EXS.OPTIONS_READ(sOPTIONS => BLOB2CLOB(lbDATA => REXSQUEUE.MSG, - sCHARSET => PKG_CHARSET.CHARSET_UTF_), + sCHARSET => PKG_CHARSET.CHARSET_UTF_), SPATH => 'queue_id'); - NPRECISION_F := PKG_EXS.OPTIONS_READ(sOPTIONS => BLOB2CLOB(lbDATA => REXSQUEUE.MSG, - sCHARSET => PKG_CHARSET.CHARSET_UTF_), - SPATH => 'precision'); + NPRECISION := PKG_EXS.OPTIONS_READ(sOPTIONS => BLOB2CLOB(lbDATA => REXSQUEUE.MSG, + sCHARSET => PKG_CHARSET.CHARSET_UTF_), + SPATH => 'precision'); case UPPER(SSTATE) when 'OK' then NSTATUS := UDO_PKG_EQUIPDS_BASE.NCMML_STATUS_PROCESSED; @@ -426,7 +433,7 @@ is SERR => SERR); if SERR is null then /* Базовая установка фактической точности "Выборки данных оборудования (классы оборудования, модели)" */ - UDO_PKG_EQUIPDS_BASE.CMML_SET_PRECISION_F(NRN => RCMML.RN, NPRECISION_F => ROUND(NPRECISION_F,0)); + UDO_PKG_EQUIPDS_BASE.CMML_SET_PRECISION(NRN => RCMML.RN, NPRECISION => ROUND(NPRECISION,0)); end if; end loop; @@ -443,6 +450,56 @@ is SMSG => PKG_STATE.SQL_ERRM()); end P_REQUIREMENTS_CB; + + /* Публикация выборки для прогоноза */ + procedure P_FORECAST_DATA + ( + NIDENT in number, -- Идентификатор процесса + NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена + ) + is + REXSQUEUE EXSQUEUE%rowtype; -- Запись позиции очереди + NDATASET_IDENT PKG_STD.TREF; -- Идентификатор данных выборки для прогноза + BRESP blob; -- Буфер для результата + SARG_DATASET_IDENT PKG_STD.TSTRING := 'NDATASET_IDENT'; -- Наименование аргумента запроса для идентификатора данных выборки для прогноза + begin + /* Считываем позицию очереди */ + REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE); + /* Читаем параметры запроса - идентификатор файлового буфера с данными для прогноза */ + begin + NDATASET_IDENT := TO_NUMBER(PKG_EXS.OPTIONS_READ(SOPTIONS => REXSQUEUE.OPTIONS, + SPATH => PKG_EXS.SMSG_OPTION_CODE_QS || '/' || + SARG_DATASET_IDENT)); + exception + when others then + P_EXCEPTION(0, 'Неверный формат числа (%s).', SARG_DATASET_IDENT); + end; + if (NDATASET_IDENT is null) then + P_EXCEPTION(0, + 'Неуказан обязательный парметр запроса - %s.', + SARG_DATASET_IDENT); + end if; + /* Читаем данные из файлового буфера */ + for C in (select T.BDATA from FILE_BUFFER T where T.IDENT = NDATASET_IDENT) + loop + if (BRESP is not null) then + P_EXCEPTION(0, 'Найдено более одного набора сведений о наработках.'); + end if; + BRESP := C.BDATA; + end loop; + if (BRESP is null) then + P_EXCEPTION(0, 'Сведений о наработках не найдено.'); + end if; + /* Возвращаем ответ */ + PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT, SRESULT => PKG_EXS.SPRC_RESP_RESULT_OK, BRESP => BRESP); + exception + when others then + /* Вернём ошибку - это фатальная */ + PKG_STATE.DIAGNOSTICS_STACKED(); + PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT, + SRESULT => PKG_EXS.SPRC_RESP_RESULT_ERR, + SMSG => PKG_STATE.SQL_ERRM()); + end P_FORECAST_DATA; /* Инициализация настроек расширения для интеграции с фреймворк по прогнозированию ресурса оборудования */ procedure INIT_EQUIPDS