你这样的问题其实不一定是FETCH INTO游标慢,你是不是只是看到过程执行慢就说它FETCH慢?真要解决这样的问题,把你的环境、表结构和语句贴出来才能帮你试验出来

解决方案 »

  1.   

    游标的定义:v_ipmomdod       ipmomdod%ROWTYPE;CURSOR cur_todaylist_qt 
       IS 
       SELECT * 
       FROM ipmomdod
       WHERE ( ( mo_stat <> '1' AND decmps_state = '1' AND ( date_nxtmodc < TRUNC( id_feedate ) + 1 
          OR date_nxtmodc IS NULL ) ) OR ( mo_stat = '2' AND DECMPS_STATE = '2' AND IPMOMDOD.execute_flag = '1') )
         AND ( TRUNC( date_end ) >= TRUNC( id_feedate ) OR date_end IS NULL )
         AND ( nurse_cell_code = istr_deptcode ) 
         AND ( item_type = '2' ) 
         AND ( ( charge_state = '1') OR ( charge_state = '2' AND subtbl_flag = '1' ) ) 
         AND ( exec_dpcd = istr_deptcode ) 
         AND inpatient_no like istr_inpatientno 
         AND decmps_state like istr_motype
         AND mo_order like istr_moorder
         ORDER BY inpatient_no; 
    FETCH是: FETCH cur_todaylist_qt INTO v_ipmomdod;环境是IBM 小型机 1G内存 ORACLE 9i FOR Unix. 操作系统AIX.
    .
      

  2.   

    游标第一次fetch into的时候非常慢,但是把这个游标的sql语句,在sqlplus中运行并不慢。
    在SQLPLUS里,SQLPLUS本身做了些转化。
      

  3.   

    SELECT * FROM ipmomdod WHERE ( ( mo_stat <> '1' AND decmps_state = '1' AND ( date_nxtmodc < TRUNC( id_feedate ) + 1 
          OR date_nxtmodc IS NULL ) ) OR ( mo_stat = '2' AND DECMPS_STATE = '2' AND IPMOMDOD.execute_flag = '1') )
         AND ( TRUNC( date_end ) >= TRUNC( id_feedate ) OR date_end IS NULL )
         AND ( nurse_cell_code = istr_deptcode ) 
         AND ( item_type = '2' ) 
         AND ( ( charge_state = '1') OR ( charge_state = '2' AND subtbl_flag = '1' ) ) 
         AND ( exec_dpcd = istr_deptcode ) 
         AND inpatient_no like istr_inpatientno 
         AND decmps_state like istr_motype
         AND mo_order like istr_moorder
         ORDER BY inpatient_no; 
    呵呵,单看语句就够复杂了,又OR又LIKE的,可能是因为我不是开发人员。你可以在SQLPLUS中执行set autotrace traceonly explain
    然后执行一下你的语句,看看执行计划是什么把它贴出来看看吧