CURSOR CURJCJL IS
                 SELECT CH
                       ,ZYCS
                       ,CXS
                       ,CLFLBH
                   FROM TBL_XD_TRANSINANDOUT_MX A
                  WHERE CSBH=I_CSBH
                    AND EXISTS (SELECT CH FROM TBL_XD_CLFBJLMX B WHERE A.CH=B.CH AND ZYJLBH=I_ZYJLBH)TBL_XD_TRANSINANDOUT_MX   3000行记录
TBL_XD_CLFBJLMX           2500行记录上面是我定义的游标,根据游标查询出的结果为1行
当游标循环取值时,即FETCH时,最快时4秒,最慢时达到30多秒,真的想不通是为什么,请高手指教。        OPEN CURJCJL;              LOOP
                 --取得下一条记录
                 BEGIN
                    FETCH CURJCJL INTO STINTJCJL;
                    (这个地方超慢,记录也不是很多啊,汙!!!!!!) 
                 END;                   IF CURJCJL%NOTFOUND THEN
                    EXIT;
                 END IF;
              end loop
        close curjcjl

解决方案 »

  1.   

    declare
    CURSOR CURJCJL IS 
                    SELECT CH 
                          ,ZYCS 
                          ,CXS 
                          ,CLFLBH 
                      FROM TBL_XD_TRANSINANDOUT_MX A 
                      WHERE CSBH=I_CSBH 
                        AND EXISTS (SELECT CH FROM TBL_XD_CLFBJLMX B WHERE A.CH=B.CH AND ZYJLBH=I_ZYJLBH); 
       STINTJCJL CURJCJL%rowtype;
    begin
            OPEN CURJCJL; 
                  LOOP 
                    --取得下一条记录 
                        FETCH CURJCJL INTO STINTJCJL; 
    exit when CURJCJL%NOTFOUND;
                  end loop 
            close curjcjl;
    end;
      

  2.   

    处理游标可以考虑bulk collect还有看执行计划吧