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

また、私が質問で見たものから、あなたはループ2についてほとんど同じことをすることができるので、あなたはループを持たないでしょう...

于 2012-08-28T13:35:24.423 に答える