Открыть и закрыть соединение в процедуре оракула

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

person Andrew    schedule 19.10.2015    source источник
comment
Почему вы не пишете триггеры? ИЛИ материализованное представление также вариант.   -  person Muhammad Muazzam    schedule 19.10.2015
comment
Есть ли способ открыть и закрыть соединение с БД в триггерах? И логика останется прежней, я думаю, если я использую триггер или процедуру?   -  person Andrew    schedule 19.10.2015
comment
Также знаете ли вы, какая часть процедуры является главным потребителем? Какое там главное событие?   -  person clq    schedule 19.10.2015
comment
я не понял твой вопрос.   -  person Andrew    schedule 19.10.2015
comment
У вас была возможность посмотреть на AWR?   -  person clq    schedule 19.10.2015
comment
Нет, я не слышал об AWR. Я рассмотрю эту концепцию.   -  person Andrew    schedule 19.10.2015


Ответы (1)


ALTER SESSION CLOSE DATABASE LINK <user_supplied>; 

Справочник

person Muhammad Muazzam    schedule 19.10.2015
comment
Я видел ссылку, которую вы предоставили, но я действительно не знаю, как я могу применить эту логику в моей процедуре для ссылок БД с использованием сеанса изменения. Было бы очень полезно, если бы вы могли привести небольшой пример, связанный с моей процедурой. Так что в этом случае мне не нужно хардкорить и назначать ссылку БД в моем запросе выбора? - person Andrew; 19.10.2015
comment
Я не проверял, пожалуйста, добавьте это в свою процедуру в последнюю строку. - person Muhammad Muazzam; 19.10.2015
comment
Хорошо, но это для закрытия ссылки на базу данных, но как я могу открыть ссылку на базу данных, и в этом случае мне нужно хардкорно и назначить ссылку на базу данных в моем запросе выбора? - person Andrew; 19.10.2015
comment
@Rahul: соединение будет автоматически открыто Oracle, если вы получите доступ к DBLink - person a_horse_with_no_name; 19.10.2015
comment
Автобус, как я уже упоминал, у меня много процедур, и я не могу использовать ALTER SESSION CLOSE DATABASE LINK в конце каждой процедуры, потому что это выдаст мне ошибку, т.е. ссылка на БД используется. - person Andrew; 19.10.2015
comment
Но вы настаиваете на том, чтобы предоставить решение для закрытия соединения с БД, поэтому я это предоставил. Дайте мне знать, в каком сценарии вам нужно закрыть, потому что во всех отношениях соединение с базой данных будет использоваться, если у вас запущено несколько процедур. - person Muhammad Muazzam; 19.10.2015
comment
Я думаю, что в этом случае я не могу использовать ALTER SESSION CLOSE DATABASE LINK. В любом другом языке программирования, таком как, например, java, у нас есть возможность открыть соединение с базой данных, выполнить некоторые запросы и, как только это будет сделано, закрыть соединение. Я пишу все процедуры внутри пакета и хочу закрыть соединение, когда процедуры внутри пакета его не используют. - person Andrew; 19.10.2015
comment
вы должны вставить этот оператор в последнюю процедуру пакета. - person Muhammad Muazzam; 19.10.2015
comment
Я попытался поместить это в свою последнюю процедуру, где я вызываю другую процедуру внутри пакета. Он выполняется, а затем я попытался запустить эту команду, чтобы проверить, закрыто ли соединение с базой данных или нет, используя этот запрос: select * from v$dblink; Но он все еще не закрывает соединение. - person Andrew; 19.10.2015
comment
вы указали подключенного пользователя в этом заявлении - person Muhammad Muazzam; 19.10.2015
comment
Нет, потому что я запускаю запрос с тем же пользователем, где я создал ссылки на базу данных. - person Andrew; 19.10.2015
comment
Давайте продолжим обсуждение в чате. - person Andrew; 19.10.2015