【问题标题】:Are Cursors used for INSERT, UPDATE and DELETE statements?游标是否用于 INSERT、UPDATE 和 DELETE 语句?
【发布时间】:2025-11-25 06:00:02
【问题描述】:

我知道可以为 SELECT 语句创建游标(隐式或显式)。

但是游标(比如隐式)是否也会为 INSERT、UPDATE 和 DELETE 操作创建。如果他们这样做有什么目的。

要明确这个问题: SELECT 语句可能会产生一百万条记录,并且创建不敏感(复制实际数据)游标有助于在客户端向前滚动时将结果返回给客户端或向后,可以避免在单个网络请求中发送所有数据。 欢迎任何其他值得一提的好处。
但是写入操作(INSERT、UPDATE 和 DELETE)是必需的游标,即使考虑并发性,这不会是资源开销吗?如果操作必须失败,它只会提前失败。或者是否需要它们进行事务隔离。因此,通过创建游标来保证原子性和一致性。 (并发可以通过 2PL 或 MVCC 等其他机制的组合来处理,但我现在更关注游标在事务中的作用

因此,似乎还需要考虑事务,每个事务都会导致创建游标(隐式)。或者考虑到存在其他处理事务的机制(有和没有并发),游标在处理事务时根本没有发言权或只是有限的作用。

【问题讨论】:

  • 您说的是 PL/SQL 中的游标还是 Oracle 在后端创建的“游标”,本质上与解析语句相同?
  • @a_horse_with_no_name,本质上是想了解游标是什么以及它们如何提供帮助。不会做太多 PL/SQL,但知道不会有什么坏处,除非它们与 SQL 使用它们的方式完全不同

标签: sql database oracle transactions cursors


【解决方案1】:

几乎每个语句都必须创建/打开一个游标(甚至是 DDL 语句)。 游标是指向私有 SQL 区域的指针,该区域存储有关 SELECT 或数据操作语言 (DML) 语句(INSERT、UPDATE、DELETE 或 MERGE)处理的信息。

如果您不创建显式游标,则使用隐式游标。隐式游标最有用和最常用的属性是%ROWCOUNT 属性,它返回受影响的行数。

查看这些文档以获取更多信息。

Working with Cursors

SQL (Implicit) Cursor Attribute

【讨论】:

  • 感谢 Oracle 参考。作为 Oracle 用户,这些参考资料对我来说非常重要。