简介
游标(Cursor)是一种数据库处理技术,它允许在查询结果集出来之前对其进行处理和操作。游标可以分为静态游标和动态游标两种类型。静态游标在查询结果集出来之后不会改变,而动态游标则会随着数据库的变化而变化。
在Oracle数据库中,存储过程可以使用游标来处理查询结果集。使用游标的主要好处是可以逐行处理查询结果集,而不是一次性将整个结果集加载到内存中。这有助于减少内存使用并提高性能。
在Oracle中,有两种类型的游标:显式游标和隐式游标。显式游标是程序员明确声明的游标,它可以允许程序员控制如何处理查询结果集。隐式游标则是在执行查询时自动创建的游标,它由Oracle数据库引擎自动处理。
在使用游标时,需要定义一个游标变量,然后使用OPEN语句打开游标,使用FETCH语句从游标中获取一行数据,最后使用CLOSE语句关闭游标。
一、使用显式游标从表中检索数据并插入另一个表中
CREATE OR REPLACE PROCEDURE insert_employees_to_new_table AS CURSOR employee_cur IS SELECT * FROM employees; emp_id employees.employee_id%TYPE; name employees.employee_name%TYPE; salary employees.salary%TYPE; BEGIN OPEN employee_cur; LOOP FETCH employee_cur INTO emp_id, name, salary; EXIT WHEN employee_cur%NOTFOUND; INSERT INTO new_table (id, name, salary) VALUES (emp_id, name, salary); END LOOP; CLOSE employee_cur; END;
在这个存储过程中,首先定义了一个名为employee_cur的显式游标变量,然后使用SELECT语句从employees表中检索所有数据。接下来定义了三个变量emp_id、name和salary来存储每一行数据的员工ID、员工名称和薪资。然后使用OPEN语句打开游标,使用LOOP循环从游标中获取每一行数据并使用INSERT语句将其插入到新表中。最后使用CLOSE语句关闭游标。
二、游标属性
- %FOUND:表示游标操作成功,如果返回值为True,表示操作成功,否则表示操作失败。
- %NOTFOUND:表示游标操作失败,如果返回值为True,表示操作失败,否则表示操作成功。
- %ROWCOUNT:表示游标操作所影响的行数,通常与INSERT、UPDATE、DELETE语句一起使用。
三、无参数游标
游标分为有参游标和无参游标两种类型,其中无参游标用于处理不需要参数的查询,如遍历表中的所有行。以下是创建无参游标示例如下。
DECLARE CURSOR无所求 IS SELECT * FROM table_name; -- 定义游标变量 BEGIN -- 打开游标 OPEN无所求; -- 循环读取游标数据 LOOP FETCH无所求 INTO <列名>; EXIT WHEN无所求%NOTFOUND; -- 处理数据 END LOOP; -- 关闭游标 CLOSE无所求; END;
DECLARE关键字用于声明游标变量,并指定游标的名称和类型(即SELECT语句)。在BEGIN块中,OPEN语句用于打开游标,FETCH语句用于读取数据并退出循环(当查询结果为空时)。最后,CLOSE语句用于关闭游标。