'select * from [table_name]' 是偷偷游标?

'select * from [table_name]' is secretly a cursor?

几天前在一次采访中有人问我 select * from [table_name] 是不是游标,因为它一次获取多条记录?

如果是那么是哪种类型? 显式隐式,为什么?

拜托,如果有人能对此进行详细说明,那将是一个很大的帮助。

Oracle 在内部创建一个游标来为您的 select 查询提供服务,因此我们将其称为 IMPLICIT 游标。

而我们将以下内容称为您自己创建的显式游标,以便对其进行更多控制。

CURSOR cur IS SELECT col FROM table WHERE condition;

显式游标是那些显式打开、获取数据、关闭的游标。

如前所述,游标的用法有两部分:

  1. 游标的定义
  2. 游标的使用

游标的定义可以像

CURSOR c IS SELECT col1, col2 FROM table_name

FOR i IN (SELECT col1, col2 FROM table_name)

接下来是差异:

  1. 显式游标需要

OPEN, FETCH, EXIT WHEN, CLOSE

  1. 隐式游标在 FOR 循环语句中执行上述所有步骤。

最后,SELECT 语句是隐式游标。

最好的, 米库图

是的,每个查询代表一个游标。

概念指南从 cursor 链接到 private SQL area,它定义为

An area in memory that holds a parsed statement and other information for processing. The private SQL area contains data such as bind variable values, query execution state information, and query execution work areas.

PL/SQL Language Reference 说:

An implicit cursor is a session cursor that is constructed and managed by PL/SQL. PL/SQL opens an implicit cursor every time you run a SELECT or DML statement.

An explicit cursor is a session cursor that you construct and manage. You must declare and define an explicit cursor, giving it a name and associating it with a query (typically, the query returns multiple rows).

这些实际上是来自 PL/SQL 的概念,所以我不确定将它们用于其他客户端的游标是否有意义,例如 SQL*Plus 或 SQL 开发人员命令行或 Java 程序。我会说游标只是 "explicit" 如果你在一些 PL/SQL 代码中使用 cursor 关键字命名它,并且因为你没有(也不能)这样做从命令行查询,它更接近隐式游标的 PL/SQL 概念。