【问题标题】:Nested cursor in a cursor游标中的嵌套游标
【发布时间】:2012-01-18 20:57:52
【问题描述】:

我有一个光标

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 行。现在这个查询可以返回多行。我怎样才能改变这个逻辑?

我正在考虑创建一个嵌套游标,它将获取记录类型的数组(我将声明),但我不知道嵌套游标如何在这里工作。

我主要关心的是效率。因为每次执行它会处理数百万条记录。你们能建议这里最好的方法吗?

【问题讨论】:

    标签: oracle plsql oracle10g cursor nested-loops


    【解决方案1】:
    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; 
    

    【讨论】:

      【解决方案2】:

      通常,您只需连接这两个表。

      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 进行昂贵的排序,以防将来创建不正确的数据,而约束是更合适的方式来保护自己。

      【讨论】:

      • * Temp_table 不是临时表。我重命名了原始表只是为了共享。 2:在内循环之前有一系列业务逻辑在执行。它的东西outer_loop ... logic ... inner loop。所以Joins 在这里不起作用。 3: distinct 关键字会带来不同的 big_id,因为 temp_table 的 pk 是别的东西,表中每个 pk 可能有多个 big_id
      猜你喜欢
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多