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
。请参见此处的几个示例