http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/static.htm#CIHCAHJA

 

本文内容

  • 声明一个游标
  • 打开一个游标
  • 用游标获取一个(Fetch)数据
  • 用游标获取全部(Fetch Bulk)数据
  • 关闭一个游标
  • 显式游标的属性

 

当需要准确控制查询时,可以在任何 PL/SQL 块(block)、子程序(subprogram)或包(package)的声明部分里声明一个显式游标。

可以使用三个语句来控制游标:OPENFETCHCLOSE

  • 首先,用 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;
/

相关文章: