У меня есть процедура, в которой я вставляю данные в таблицу temp_soap_monitoring, используя инструкцию select. У меня есть таблица soap_monitoring в базе данных FONIC_RETAIL
, откуда я хочу взять данные и вставить в таблицу temp_soap_monitoring. Я выполняю задание планировщика каждые 5 минут для этой процедуры, чтобы всегда получать последние данные из таблицы soap_monitoring @ fonic_retail. Проблема этой процедуры заключается в том, что для выполнения этой процедуры требуется слишком много затрат и времени выполнения запроса. Каждый раз, когда он пытается получить данные из ссылки db и сохраняет ее в моей локальной базе данных. Я помню, что в jave, php и других языках программирования у нас есть способ открыть соединение db, когда мы пытались извлечь данные из db-ссылки, а затем, как только вставка будет завершена, мы можем закрыть соединение db. Таким образом, производительность улучшается, а также не загружает ссылку на db. В этом методе нам не нужно назначать ссылку db для извлечения данных. Поэтому я верю, что есть способ применить эту логику в моей процедуре оракула. Вопрос возникает потому, что сейчас я жестко кодирую ссылку db, но теперь у меня есть еще 3 ссылки db, и я не хочу дублировать одну и ту же процедуру, назначая difffferent db links.Открытое и закрытое соединение в процедуре оракула
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
[email protected]_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 [email protected]_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;
Почему вы не пишете триггеры? Или материализованный вид также вариант. –
Есть ли способ открыть и закрыть соединение db в триггерах? И логика останется такой же, я думаю, если я использую триггер или процедуру? – Andrew
Также вы знаете, какая часть процедуры является главным потребителем? Какое главное событие там? – clq