首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle PL/SQL FOR Loop Optimisation

Oracle PL/SQL FOR Loop Optimisation
EN

Stack Overflow用户
提问于 2012-08-28 21:11:33
回答 1查看 562关注 0票数 0

请你可以帮助我,如果可能的话,我需要优化下面的代码块,如果要迭代的值更快。请参见下面的语句:

代码语言:javascript
复制
for CONSULTANT_RECORD IN CONSULTANT_CURSOR LOOP /*Loop 2*/
VData := VData||crlf2||CONSULTANT_RECORD.USER_FIRSTNAME||'   '||CONSULTANT_RECORD.USER_SURNAME;

vTOT_LOG_CLOSED4USER := 0;
vAVERAGE_DAY := 0;
vTOT_DAYS := 0;
for x in 1..vlastday loop /*Loop 3*/
  select COUNT(DISTINCT LOG_NO) as "LOG_COUNT" INTO vLOG_COUNTER
    FROM DMS_CRM.TBL_DMS_SERVICE_REQUESTS_HIST
      WHERE LOG_STATUS = 'Resolved'
       AND TO_CHAR(HIST_DATE_TIME_STAMP, 'MONTH,YYYY') = TO_CHAR(SYSDATE, 'MONTH,YYYY')
       AND TO_CHAR(HIST_DATE_TIME_STAMP, 'DD') = lpad(to_char(x),2,'0')
       AND OWNER_USER_ID IS NOT NULL
       AND OWNER_USER_ID = CONSULTANT_RECORD.OWNER_USER_ID;

    end loop;
END LOOP;

这个问题开始发生在评论循环3中,考虑到我是在oracle应用门户上开发的,所以我无法运行查询优化……我的表的索引也是正确的(如果有人想对此发表评论的话)。

致以敬意,

PS。没有人给我回复他们版本的代码..........我仍然在努力解决这个问题:-(

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-28 21:35:24

我认为最好的循环是完全没有循环(当然,如果可以避免的话)。假设vlastday是一个集合,您可以这样做

代码语言:javascript
复制
select COUNT(DISTINCT LOG_NO) as "LOG_COUNT" 
FROM DMS_CRM.TBL_DMS_SERVICE_REQUESTS_HIST
INNER JOIN 
  (
    SELECT lpad(to_char(t.COLUMN_VALUE ),2,'0') as x 
    from table(vlastday)t
  )a ON (TO_CHAR(HIST_DATE_TIME_STAMP, 'DD') = a.x)
  WHERE LOG_STATUS = 'Resolved'
   AND TO_CHAR(HIST_DATE_TIME_STAMP, 'MONTH,YYYY') = TO_CHAR(SYSDATE, 'MONTH,YYYY')       
   AND OWNER_USER_ID IS NOT NULL
   AND OWNER_USER_ID = CONSULTANT_RECORD.OWNER_USER_ID
   GROUP BY a.x;

然后取决于您的任务,您需要要么去掉GROUP BY以便可以select into,要么在这个变量中声明一个数字和BULK COLLECT的集合。

此外,从我在问题中看到的情况来看,你可以对Loop2做几乎相同的事情,这样你就不会有循环……

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12160026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档