📅  最后修改于: 2023-12-03 15:33:42.688000             🧑  作者: Mango
在 PL/SQL 中,游标(Cursor)是用于访问一系列结果集中的数据的工具。通过游标,我们可以从一个结果集中一次获取一行数据,然后对该行数据进行分析或处理,然后取下一行数据。在本文中,我们将深入探讨 PL/SQL 中的游标。
在 PL/SQL 中,有两种类型的游标:
当我们执行一条 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 自动创建和管理,而显式游标必须被显式地定义、打开、关闭和从结果集中获取数据。要使用游标,我们必须通过打开游标、获取数据和关闭游标三个步骤来管理游标。