Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 显式打开和关闭游标_Database_Oracle_Plsql_Cursors - Fatal编程技术网

Database 显式打开和关闭游标

Database 显式打开和关闭游标,database,oracle,plsql,cursors,Database,Oracle,Plsql,Cursors,我一直在阅读数据库游标,我看到的每个示例代码都显式地打开和关闭游标。我只使用过几次,我从来没有这样做过。谁能告诉我为什么有必要这样做?我知道如果你不关闭一个光标,你可以创建内存泄漏,但我从来没有打开过 谢谢如果您的游标是全局游标(我猜您在没有问题的地方使用了本地游标,因为它们在超出范围时是关闭的),则必须显式关闭它们 不关闭全局游标有几个问题 用于光标的内存未释放 您可以打开的游标的最大数目为。最终您将无法创建另一个游标,因为您将打开最大数量的游标 如果你问我为什么要用光标? -有时您需要在

我一直在阅读数据库游标,我看到的每个示例代码都显式地打开和关闭游标。我只使用过几次,我从来没有这样做过。谁能告诉我为什么有必要这样做?我知道如果你不关闭一个光标,你可以创建内存泄漏,但我从来没有打开过

谢谢

如果您的游标是全局游标(我猜您在没有问题的地方使用了本地游标,因为它们在超出范围时是关闭的),则必须显式关闭它们

不关闭全局游标有几个问题

  • 用于光标的内存未释放
  • 您可以打开的游标的最大数目为。最终您将无法创建另一个游标,因为您将打开最大数量的游标
如果你问我为什么要用光标?
-有时您需要在行中循环(例如使用常规for循环)。在面向集合的方法中不能这样做-必须使用游标。

这是一个很好的实践,因为无论您是否同时运行其他查询,您都可以轻松获得任何特定查询(ROWCOUNT、NOTFOUND等)的SQL状态。此外,您还可以在包中重用游标,创建其行类型的数据类型,在其上进行循环,以及各种各样的好东西

您只需打开和关闭显式游标。具有由Oracle自动管理的优势。隐式游标示例:

DECLARE
   l_dept dept%rowtype;
BEGIN
   -- implicit SELECT INTO
   SELECT * INTO l_dept FROM dept WHERE deptno = :deptno;
   -- implicit LOOP
   FOR cc IN (SELECT emp.* FROM emp WHERE deptno = l_dept.deptno) LOOP
      dbms_output.put_line('emp='||cc.empno);
   END LOOP;
END;
/

隐式游标在代码中更加简洁,您不必担心关闭它们。我还发现,将光标的代码放在实际使用的位置更为清晰。我很少使用显式游标,而且只有当它们可以在包中的多个位置重复使用时(那么为什么不将其放在一个过程中?)。

从dept中选择*进入l_dept,deptno=:deptno+1,你对隐式游标的评论是正确的。由于懒惰,我讨厌显式游标所需的额外编码。另一个好处是:您不必检查数据不足的情况。处理完所有数据后,循环退出。