嵌套隐式游标未清除数据

Posted

技术标签:

【中文标题】嵌套隐式游标未清除数据【英文标题】: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 值一个,但这不是我猜的想法。

【问题讨论】:

【参考方案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;

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

祝你好运。

【讨论】:

你说得对,我正试图从这个匿名街区做一些报告,我想我只是在一杯水里淹死了。我想我可以使用这种方法,谢谢:)

以上是关于嵌套隐式游标未清除数据的主要内容,如果未能解决你的问题,请参考以下文章

如何清除 OBIEE 游标缓存(演示服务器)

MySql使用存储过程清除数据库所有表数据,保存数据结构

oracle中游标的使用?

解决iframe缓存机制导致页面不清除缓存不刷新页面的bug

循环遍历表单上所有未绑定的控件并清除数据

sh 删除(清除)未使用的Docker数据