http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/static.htm#CIHCAHJA
本文内容
- 声明一个游标
- 打开一个游标
- 用游标获取一个(Fetch)数据
- 用游标获取全部(Fetch Bulk)数据
- 关闭一个游标
- 显式游标的属性
当需要准确控制查询时,可以在任何 PL/SQL 块(block)、子程序(subprogram)或包(package)的声明部分里声明一个显式游标。
可以使用三个语句来控制游标:OPEN、FETCH 和 CLOSE。
- 首先,用 OPEN 语句初始化游标,确定结果集;
- 之后,重复执行 FETCH 语句,知道所有数据行已经被检索,或使用 BULK COLLECT 子句一次性获取所有数据;
- 当最后一行数据已经被处理,可以用 CLOSE 语句释放游标。
该技术需要比其他技术,如 SQL 游标 FOR LOOP,更多的代码。但它的优点是灵活。你可以:
- 通过声明和打开多个游标,来并行处理很多查询
- 在一个循环迭代中处理多个行,掠过行,把处理分割到多个循环
本文示例使用的表,位于 Oracle OE Schema 示例。另外,示例在 SQL*PLUS 下运行。示例最后 "/" 符号可让 SQL*PLUS 编译代码;而在 PL/SQL Developer 下则可有可无。
声明一个游标
在语句中引用游标前,必须声明游标。给出游标的名称,并与指定查询关联。另外,也可以为游标声明一个返回类型,如 table_name%ROWTYPE。也可以在 WHERE 子句指定游标参数(不是本地变量)。游标参数可以有默认值。
示例 1:演示声明一个游标。
DECLARE
my_emp_id NUMBER(6); -- variable for employee_id
my_job_id VARCHAR2(10); -- variable for job_id
my_sal NUMBER(8, 2); -- variable for salary
CURSOR c1 IS
SELECT employee_id, job_id, salary FROM employees WHERE salary > 2000;
my_dept departments%ROWTYPE; -- variable for departments row
CURSOR c2 RETURN departments%ROWTYPE IS
SELECT * FROM departments WHERE department_id = 110;
BEGIN
NULL;
END;
/