【问题标题】:Nested implicit cursor not clearin data嵌套隐式游标未清除数据
【发布时间】:2018-05-18 17:29:47
【问题描述】:

我有一个 oracle pl/sql 匿名块,在 for 循环中有一个隐式游标,它以这种方式嵌套在 for 循环中:

FOR secuence IN 1..3 LOOP
  FOR registro_notificacion IN (
             SELECT 'data' FROM my_table WHERE my_table.column1=secuence)
      LOOP
         --work with data
  END LOOP; END LOOP;

当我在 secuence=1 上返回值而在其他值上为空时,就会出现问题,因为由于某种原因,隐式游标本身不是 clean。 因此,在secuence=2 上,我应该什么都不做,因为没有数据,但由于某种原因,它仍然在第一个循环(secuence=1) 上返回了数据。

我应该在每次迭代结束时声明并显式地关闭游标吗?虽然我考虑使用 3 个循环,每个 secuence 值一个,但这不是我猜的想法。

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    我一直使用光标 for 循环,从未见过您描述的情况。我唯一能想到的是,您在程序的其他地方声明了一个名为 secuence 的变量,该变量恰好设置为 1。在这种情况下,PL/SQL 编译器可能选择使用全局变量 secuence 而不是比生成 SQL 语句时的循环控制变量secuence。一个好的经验法则是为每个循环控制变量使用唯一的名称。

    但是,您可以使用以下方法完全摆脱 FOR secuence... 循环:

    FOR registro_notificacion IN (SELECT 'data'
                                    FROM my_table
                                    WHERE my_table.column1 BETWEEN 1 AND 3
                                    ORDER BY my_table.column1)
    LOOP
         --work with data
    END LOOP;
    

    打开一个游标通常比打开三个游标成本更低。

    祝你好运。

    【讨论】:

    • 你说得对,我正试图从这个匿名街区做一些报告,我想我只是在一杯水里淹死了。我想我可以使用这种方法,谢谢:)
    猜你喜欢
    • 2017-05-19
    • 2011-06-01
    • 2012-01-18
    • 2015-10-14
    • 2012-06-15
    • 1970-01-01
    • 2021-12-28
    • 2011-08-23
    • 1970-01-01
    相关资源
    最近更新 更多