SQL 中的游标

2025年2月2日 | 阅读7分钟

在SQL中,游标是在语句执行期间由数据库服务器分配的临时工作区。

它是一个数据库对象,允许我们一次访问一行数据。当用户需要逐行更新表中的行时,SQL中的这个概念非常有用。

SQL中的游标与其他编程语言中的循环技术相同。游标持有的元组集合称为活动集。

在SQL数据库系统中,用户使用DECLARE语句定义游标,并以SELECT语句作为参数,这有助于返回一组行。

在本文的SQL文章中,我们将学习游标的类型、游标的生命周期、游标的语法以及游标的实现。

SQL中的游标类型

结构化查询语言中的游标有两种类型:

  1. 隐式游标
  2. 显式游标

隐式游标

当系统对SQL查询执行INSERT、DELETE和UPDATE操作时,SQL服务器会生成和分配这些类型的游标。

此游标也称为SQL中的默认游标。

当SELECT查询选择单行时,系统也会创建隐式游标。

显式游标

这些类型的游标由用户使用SELECT语句创建。

显式游标包含多个记录,但一次只处理一行。它使用一个指针,在读取一行后会移到下一行。

它主要用于获得对临时工作区的额外控制。

游标的生命周期

游标的生命周期分为以下五个阶段:

  1. 声明游标
  2. 打开游标
  3. 从游标中获取数据
  4. 关闭游标连接
  5. 取消分配游标

让我们简要讨论每个阶段。

1. 声明游标

首先,我们必须使用以下SQL语法声明游标:

在此语法中,我们必须在DECLARE关键字之后指定游标的名称和数据类型。之后,我们必须编写SELECT语句,该语句定义了游标的结果集。

2. 打开游标

这是第二个阶段,用于打开游标以存储从结果集中检索到的数据。我们可以使用以下SQL语法打开游标:

3. 获取游标

这是游标生命周期中的第三个阶段,用于获取行,以便对游标中当前活动元组执行插入、删除和更新操作。

以下是用于从游标获取数据的语法中的六个选项:

i. FIRST:此选项允许系统仅访问游标表中的第一条记录。FIRST选项的语法如下:

ii. LAST:此选项允许系统仅访问游标表中的最后一条记录。LAST选项的语法如下:

iii. NEXT:此方法允许系统沿正方向访问游标表中的数据。它是默认选项。此方法的语法如下:

iv. PRIOR:此方法允许系统沿反方向访问游标表中的数据。此选项的语法如下:

v. ABSOLUTE n:此方法允许系统访问游标表中精确第n行的数据。此选项的语法如下:

vi. RELATIVE n:此方法允许系统以增量和减量过程访问数据。此选项的语法如下:

4. 关闭游标

这是游标过程中的第四个阶段。当我们完成游标的工作后,我们必须在此阶段关闭游标。我们可以在SQL中使用以下查询关闭游标:

CLOSE Cursor_Name;

5. 取消分配游标

这是游标生命周期的最后一个阶段。在此部分,我们必须删除游标的定义并释放与游标关联的所有系统资源。

SQL中游标的语法

基本游标类型

结构化查询语言中的游标有以下四种基本类型:

  1. 静态游标
  2. 向前滚动游标
  3. 键集驱动游标
  4. 动态游标

静态游标

静态游标可以向前和向后滚动。这类游标在创建游标期间填充结果集。与其他游标相比,它速度较慢,并且占用更多内存空间。

默认情况下,这些类型的游标是可滚动的。静态游标不允许数据库用户修改和删除数据。

向前滚动游标

这类游标仅通过结果集向前访问和更新数据。因此,它是所有四种游标中最快的游标。

此游标的主要缺点是它不支持向后滚动。

以下是“向前滚动游标”的三种类型:

  1. Forward_Only KEYSET,
  2. Forward_Only KEYSET,
  3. FAST_FORWARD

动态游标

动态游标与静态游标正好相反。它允许我们在游标打开时执行INSERT、DELETE和UPDATE操作。

它检查结果集中对行和值的所有修改。

键集驱动游标

这类游标从第一行到最后一行以及从最后一行到第一行访问数据。当用户打开KEYSET游标时,它会自动创建一个唯一值列表,这些值唯一标识结果集中的每一行。

SQL中游标的示例

使用以下查询在SQL中创建一个Student表:

现在,像下面的块所示,向上面的Student表中插入一些值:

我们可以使用SQL中的以下SELECT语句检查Student表的数据:

此查询在输出中显示Student表的数据:

Student_RollNo学生姓名Student_CourseStudent_Age学生分数
1AmitBCA1988
2RahulMCA2198
3JonesB.tech2093
4RiyaBCA1989
5AaniyaBBA2192
6SaketMCA1995
7ShobhitMBA2090
8IshikaBCA2189
9ParulB.tech1991
10YuktiBCA2096

现在,我们将创建以下游标来显示Student表中的学生记录:

上述游标给出以下输出:

Student_RollNo学生姓名Student_Course
1AmitBCA
2RahulMCA
3JonesB.tech
4RiyaBCA
5AaniyaBBA
6SaketMCA
7ShobhitMBA
8IshikaBCA
9ParulB.tech
10YuktiBCA