【发布时间】:2015-10-19 08:36:16
【问题描述】:
我有以下过程,我使用 select 语句将数据插入 temp_soap_monitoring 表。我在FONIC_RETAIL 数据库中有soap_monitoring 表,我想从中获取数据并插入到 temp_soap_monitoring 表中。我为此过程每 5 分钟执行一次调度程序工作,以便始终从soap_monitoring@fonic_retail 表中获取最新数据。这个过程的问题是运行这个过程需要太多的成本和查询执行时间。每次它尝试从 db 链接获取数据并将其保存在我的本地数据库中。我记得在 jave、php 和其他编程语言中,当我们尝试从 db 链接获取数据时,我们有方法打开 db 连接,然后一旦插入完成,我们就可以关闭 db 连接。因此性能提高了,并且它也不会对 db 链接施加负载。在这种方法中,我们不必分配数据库链接来获取数据。所以我相信有什么方法可以在我的 oracle 程序中应用这个逻辑。出现问题是因为现在我正在对 db 链接进行硬编码,但现在我还有 3 个 db 链接,我不想通过分配不同的 db 链接来重复相同的过程。
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;
【问题讨论】:
-
为什么不写触发器?或者物化视图也是一种选择。
-
有没有办法在触发器中打开和关闭数据库连接?如果我使用触发器或过程,我认为逻辑将保持不变?
-
另外你知道程序的哪一部分是最高消费者吗?那里最重要的活动是什么?
-
我没听懂你的问题。
-
您有机会了解 AWR 吗?
标签: oracle stored-procedures plsql transactions dblink