У меня есть процедура ниже, в которой я вставляю данные в таблицу temp_soap_monitoring, используя оператор select. У меня есть таблица soap_monitoring в базе данных FONIC_RETAIL
, откуда я хочу взять данные и вставить их в таблицу temp_soap_monitoring. Я выполняю задание планировщика каждые 5 минут для этой процедуры, чтобы всегда получать последние данные из таблицы soap_monitoring@fonic_retail. Проблема этой процедуры в том, что для запуска этой процедуры требуется слишком много затрат и времени на выполнение запроса. Каждый раз, когда он пытается получить данные из ссылки db и сохранить их в моей локальной базе данных. Я помню, что в jave, php и других языках программирования у нас есть метод для открытия соединения с базой данных, когда мы пытались получить данные из ссылки на базу данных, а затем, когда вставка завершена, мы можем закрыть соединение с базой данных. Таким образом, производительность улучшается, и это также не нагружает ссылку db. В этом методе нам не нужно назначать ссылку db для получения данных. Итак, я верю, есть ли способ применить эту логику в моей процедуре оракула. Возникает вопрос, потому что прямо сейчас я жестко кодирую ссылку на БД, но теперь у меня есть еще 3 ссылки на БД, и я не хочу дублировать ту же процедуру, назначая разные ссылки на БД.
PROCEDURE "EXT_SOAP_MONITORING" AS
LAST_SM_ID Number := 0;
LAST_CAPT_DATE DATE;
BEGIN
SELECT LAST_TASK_ID INTO LAST_SM_ID FROM CAPTURING where DB_TABLE='TEMP_SOAP_MONITORING';
insert into TEMP_SOAP_MONITORING(ID,REQUEST_XML,RESPONSE_XML,WEB_SERVICE_NAME,WEB_METHOD_NAME,CREATE_DATE,ERROR_CODE,ERROR_MESSAGE)
select ID,REQUEST_XML,RESPONSE_XML,WEB_SERVICE_NAME,WEB_METHOD_NAME,CREATE_DATE,ERROR_CODE,ERROR_MESSAGE from
SOAP_MONITORING@FONIC_RETAIL WHERE WEB_SERVICE_NAME ='RatorWebShopService' and WEB_METHOD_NAME = 'placeShopOrder' and ID > LAST_SM_ID order by ID desc;
update
CAPTURING set LAST_TASK_ID=
CASE WHEN ((SELECT MAX(ID) from TEMP_SOAP_MONITORING) IS NULL) AND (LAST_TASK_ID IS NULL) THEN (SELECT MAX(ID) from SOAP_MONITORING@FONIC_RETAIL)
WHEN (SELECT MAX(ID) from TEMP_SOAP_MONITORING) IS NULL THEN LAST_TASK_ID + 1
ELSE (SELECT MAX(ID) from TEMP_SOAP_MONITORING) END,
CAPTURING_DATE = CURRENT_TIMESTAMP, LAST_CAPTURED_DATE = LAST_CAPT_DATE where DB_TABLE='TEMP_SOAP_MONITORING';
END EXT_SOAP_MONITORING;