2015-05-05 68 views
2

我有一個代碼,像這樣如何動態存儲循環的值並在for循環中斷後返回?

FOR K IN (SELECT E.COLUMN_VALUE 
        FROM TABLE (SELECT CAST(LEAVE_HOLIDAY_CAL_PKG_NEW.GES_LEV_COLUMN_TO_ROWS_FNC(V_CAL_SUBTSR, 
                            ',') AS 
              LEV_TABLE_OF_VARCHAR_TYP) 
           FROM DUAL) E) LOOP 

    V_CAL_DESC := CASE WHEN K.COLUMN_VALUE = 'W' THEN 'Project Weekend-' || TO_CHAR((V_DATE1 + V_ITERATION), 'Day') WHEN K.COLUMN_VALUE = 'H' THEN 'Holiday' ELSE 'Working day' END; 

    IF K.COLUMN_VALUE = 'H' THEN 
     FETCH C_HOLIDAY_CURSR 
     INTO V_HOLIDAY_ID; 

     SELECT H.HOLIDAY_DESC 
     INTO V_CAL_DESC 
     FROM LEAVE.LEV_NEW_EMP_HOLIDAY_DTLS H 
     WHERE H.HOLIDAY_ID = V_HOLIDAY_ID; 
    END IF; 



    INSERT INTO LEV_CAL_TEMP_TBL 
    VALUES 
     (IN_PERSON_ID, K.COLUMN_VALUE, V_DATE1 + V_ITERATION, V_CAL_DESC); 
    COMMIT; 
    V_ITERATION := V_ITERATION + 1; 

    END LOOP; 


OPEN C_CAL_CURSR FOR 
select *from LEV_CAL_TEMP_TBL; 
每一個for循環運行一行在表中插入GES_LEV_CAL_TEMP_TBL時間

如此。

但我想避免這種情況,因爲這可能會影響系統的性能,那麼有什麼方法可以將這些值存儲在某個地方 ,並在FOR循環結束後返回相同的遊標。

非常感謝。

+0

你可以使用一個集合 – psaraj12

+0

能否請您詳細一點,我不知道很多關於光標實際上:( –

+0

U可以做的c_cal_cursor同一個循環,而不是使用臨時表內完成的處理和另一個光標 – psaraj12

回答

0

一個光標FOR LOOP是逐行又名緩慢的過程。

如果你必須PL/SQL做到這一點,然後用BULK COLLECTFORALL語句

  • 聲明一個集合類型

例如,

TYPE t_lev_cal_temp_tbl IS TABLE OF lev_cal_temp_tbl%ROWTYPE; 

l_lev_cal t_lev_cal_temp_tbl := t_lev_cal_temp_tbl(); 
  • FORALL插入語句:

例如,

FORALL i IN l_lev_cal.first .. l_lev_cal.last 
    INSERT INTO lev_cal_temp_tbl VALUES l_tab(i); 
+0

Aint有一種方法避免插入表中,並直接返回光標。 –

+0

庫馬爾但我該怎麼做處理,我不必直接插入表中befor我需要獲取FOR循環的每個值,並基於該值我需要計算其他三個值,然後插入它們。 –

+0

@Thepallav_abhi你可以用你想要轉換數據的方式聲明一個帶有select查詢的遊標,然後你需要使用** BULK COLLECT **來填充集合'l_lev_cal'。在這裏看幾個例子http://www.morganslibrary.org/reference/plsql/array_processing.html –