繁体   English   中英

游标中的嵌套游标

[英]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,以便不是执行一系列单行INSERTUPDATE操作的循环,而是执行修改整个行集的单个INSERTUPDATE 如果您确实需要分块处理数据,那么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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM