0

如果可能的话,请你帮助我,如果为了更快地迭代值,我需要优化下面的代码块。见以下声明:

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。没有人用他们的代码版本回复我…………我仍在为此苦苦挣扎:-(

4

1 回答 1

1

我认为最好的循环根本就是没有循环(当然,如果可以避免的话)。假设 vlastday 是一个集合,你可以做类似的事情

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 执行几乎相同的操作,这样您就不会出现循环...

于 2012-08-28T13:35:24.423 回答