Sql 如何动态存储循环的值,并在for循环中断时返回它?

Sql 如何动态存储循环的值,并在for循环中断时返回它?,sql,oracle,plsql,oracle11g,oracle10g,Sql,Oracle,Plsql,Oracle11g,Oracle10g,我有一个类似这样的代码 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,

我有一个类似这样的代码

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循环结束后在游标中返回相同的值

提前非常感谢。

循环的光标是逐行的,也就是一个缓慢的过程

如果必须在
PL/SQL
中执行此操作,则使用批量收集对所有语句执行此操作

  • 声明集合类型
比如说,

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 i IN l_lev_cal.first .. l_lev_cal.last
    INSERT INTO lev_cal_temp_tbl VALUES l_tab(i);
  • FORALL插入语句:
比如说,

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 i IN l_lev_cal.first .. l_lev_cal.last
    INSERT INTO lev_cal_temp_tbl VALUES l_tab(i);

你可以使用一个集合。你能详细说明一下吗?实际上,我对游标不太了解:(u可以在同一个循环中通过c_cal_游标进行处理,而不是使用临时表和另一个cursor@psaraj12但这将在每次na时替换游标的值。我需要的是,如果每次迭代都添加一行,并且迭代的次数为4,我的要求是将所有这4个游标都包含在游标内,这样可以避免插入表中,并直接重新交上cursor.Kumar但我该如何处理,在我需要获取for循环的每个值之前,我不必直接插入到表中,根据该值,我需要计算其他三个值,然后插入它们。@Thepallav_abhi您可以用select查询声明一个游标,方法是转换data,然后您需要使用批量收集来填充集合
l\u lev\u cal
。请参见此处的几个示例