[英]Nested cursor in a cursor
我有一个光标
CURSOR B_CUR IS select DISTINCT big_id from TEMP_TABLE;
这将返回多个值。 早些时候它被用作
FOR b_id IN B_CUR LOOP
select s.col1, s.col2 INTO var1, var2 from sometable s where s.col3 = b_id.col1;
END LOOP;
之前确定内部选择查询总是返回1行。 现在,此查询可以返回多行。 我怎样才能改变这种逻辑?
我正在考虑创建一个嵌套游标,该游标将获取到记录类型的数组(我将声明),但是我不知道嵌套游标如何在这里工作。
我主要担心的是效率。 因为它将在每次执行时处理数百万条记录。 你们能提出一下这里最好的方法吗?
通常,您只需加入两个表。
FOR some_cursor IN (SELECT s.col1,
s.col2
FROM sometable s
JOIN temp_table t ON (s.col3 = t.col1))
LOOP
<<do something>>
END LOOP
但是,由于您关注效率
TEMP_TABLE
真的是临时表吗? 如果是这样,为什么? Oracle实际需要使用临时表的情况极为罕见,这使我怀疑您最初可能无法有效地填充临时表。 FOR
循环来处理TEMP_TABLE
中的数据? 逐行处理是在PL / SQL中执行任何操作的最慢方式,因此如果您关注效率,通常可以避免这种情况。 从性能的角度来看,您希望最大化SQL,以便不是执行一系列单行INSERT
或UPDATE
操作的循环,而是执行修改整个行集的单个INSERT
或UPDATE
。 如果您确实需要分块处理数据,那么PL / SQL收集和批量处理将在其中发挥作用,但效率不如直接SQL。 TEMP_TABLE
的查询中有DISTINCT
? 您是否真的希望会有重复的big_id
值是正确的? 在大多数情况下,人们会错误地使用DISTINCT
来掩盖数据连接不正确的问题,或者您强迫Oracle做昂贵的排序,以防万一将来在约束更合适的情况下创建不正确的数据保护自己的方法。 FOR b_id IN B_CUR LOOP
for c_id in (select s.col1, s.col2 INTO var1, var2 from sometable s where s.col3 = b_id.col1)loop
......
end loop;
END LOOP;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.