📜  PL SQL-游标(1)

📅  最后修改于: 2023-12-03 15:33:42.688000             🧑  作者: Mango

PL/SQL 游标

在 PL/SQL 中,游标(Cursor)是用于访问一系列结果集中的数据的工具。通过游标,我们可以从一个结果集中一次获取一行数据,然后对该行数据进行分析或处理,然后取下一行数据。在本文中,我们将深入探讨 PL/SQL 中的游标。

游标的类型

在 PL/SQL 中,有两种类型的游标:

  1. 隐式游标(Implicit Cursor)
  2. 显式游标(Explicit Cursor)
隐式游标

当我们执行一条 SELECT 语句时,PL/SQL 会自动创建一个隐式游标来管理结果集的数据。隐式游标不需要被定义、打开、关闭或显式地从结果集中获取数据。例如,对于下面的 SELECT 语句:

SELECT first_name, last_name FROM employees WHERE department_id = 20;

我们可以使用以下代码来循环遍历结果集:

BEGIN
  FOR employee IN (SELECT first_name, last_name FROM employees WHERE department_id = 20) LOOP
    DBMS_OUTPUT.PUT_LINE(employee.first_name || ' ' || employee.last_name);
  END LOOP;
END;

在此代码中,我们没有显式地创建或打开游标,而是将 SELECT 语句放在一个 FOR 循环中,PL/SQL 自动创建了一个隐式游标来管理结果集的数据。

显式游标

与隐式游标不同,显式游标必须被显式地定义、打开、关闭和从结果集中获取数据。我们可以使用以下语法定义显式游标:

CURSOR cursor_name IS
  SELECT column1, column2, ... FROM table_name WHERE condition;

例如,下面是一个简单的显式游标定义:

DECLARE
  CURSOR employees_cur IS
    SELECT first_name, last_name FROM employees WHERE department_id = 20;
BEGIN
  -- 程序代码
END;

在此代码中,我们定义了一个名为 employees_cur 的游标,该游标从 employees 表中选择部门 ID 为 20 的员工的名字。

游标的使用
打开游标

定义游标后,我们必须打开游标以从结果集中获取数据。我们可以使用以下语法打开游标:

OPEN cursor_name;

例如,以下代码打开了名为 employees_cur 的游标:

DECLARE
  CURSOR employees_cur IS
    SELECT first_name, last_name FROM employees WHERE department_id = 20;
BEGIN
  OPEN employees_cur;
  -- 程序代码
END;
获取数据

打开游标后,我们可以使用以下语法从结果集中获取数据:

FETCH cursor_name INTO variable1, variable2, ...;

例如,以下代码获取了名为 employees_cur 的游标的第一行数据,并将其存储在 first_name 和 last_name 变量中:

DECLARE
  CURSOR employees_cur IS
    SELECT first_name, last_name FROM employees WHERE department_id = 20;
  v_first_name employees.first_name%TYPE;
  v_last_name employees.last_name%TYPE;
BEGIN
  OPEN employees_cur;
  FETCH employees_cur INTO v_first_name, v_last_name;
  DBMS_OUTPUT.PUT_LINE(v_first_name || ' ' || v_last_name);
END;
循环遍历

获取数据后,我们通常需要循环遍历结果集以处理每一行数据。我们可以使用以下语法在循环中获取数据:

LOOP
  FETCH cursor_name INTO variable1, variable2, ...;
  EXIT WHEN cursor_name%NOTFOUND;
  -- 程序代码
END LOOP;

例如,以下代码遍历了名为 employees_cur 的游标的所有行数据,并将每一行数据输出到控制台:

DECLARE
  CURSOR employees_cur IS
    SELECT first_name, last_name FROM employees WHERE department_id = 20;
  v_first_name employees.first_name%TYPE;
  v_last_name employees.last_name%TYPE;
BEGIN
  OPEN employees_cur;
  LOOP
    FETCH employees_cur INTO v_first_name, v_last_name;
    EXIT WHEN employees_cur%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(v_first_name || ' ' || v_last_name);
  END LOOP;
  CLOSE employees_cur;
END;
关闭游标

循环遍历完结果集后,我们应该关闭游标以释放资源。我们可以使用以下语法关闭游标:

CLOSE cursor_name;

例如,以下代码在循环遍历完名为 employees_cur 的游标后关闭游标:

DECLARE
  CURSOR employees_cur IS
    SELECT first_name, last_name FROM employees WHERE department_id = 20;
  v_first_name employees.first_name%TYPE;
  v_last_name employees.last_name%TYPE;
BEGIN
  OPEN employees_cur;
  LOOP
    FETCH employees_cur INTO v_first_name, v_last_name;
    EXIT WHEN employees_cur%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(v_first_name || ' ' || v_last_name);
  END LOOP;
  CLOSE employees_cur;
END;
总结

游标是访问结果集中数据的一种工具。在 PL/SQL 中,有两种类型的游标:隐式游标和显式游标。隐式游标由 PL/SQL 自动创建和管理,而显式游标必须被显式地定义、打开、关闭和从结果集中获取数据。要使用游标,我们必须通过打开游标、获取数据和关闭游标三个步骤来管理游标。