2015-10-19 4 views
1

У меня есть процедура, в которой я вставляю данные в таблицу 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; 
+0

Почему вы не пишете триггеры? Или материализованный вид также вариант. –

+0

Есть ли способ открыть и закрыть соединение db в триггерах? И логика останется такой же, я думаю, если я использую триггер или процедуру? – Andrew

+0

Также вы знаете, какая часть процедуры является главным потребителем? Какое главное событие там? – clq

ответ

3
ALTER SESSION CLOSE DATABASE LINK <user_supplied>; 

Reference

+0

Я видел ссылку, которую вы предоставили, но я действительно не знаю, как я могу применить эту логику в моей процедуре для ссылок db с помощью alter session. Будет очень полезно, если вы можете дать небольшой пример, связанный с моей процедурой. Итак, в этом случае мне не нужно хардкор и назначить ссылку db в моем запросе select? – Andrew

+0

Я не проверял его, пожалуйста, добавьте его в свою процедуру на последней строке. –

+0

Хорошо, но это для закрытия ссылки на базу данных, но как я могу открыть ссылку на базу данных, и в этом случае мне нужно хардкор и назначить ссылку db в моем запросе на выбор? – Andrew