SQL是面向集合的,一条SQL语句可以产生或处理多条记录。
主语言是面向记录的,一组主变量只能存放一条记录。
所以仅使用朱变量并不能完全满足SQL语句向应用程序输出数据的要求,为此嵌入式SQL引入了游标的概念。
游标(cursor):系统为用户开设了一个数据缓冲区,存放SQL语句的执行结果,每个游标区都有一个名字。用户可以通过游标逐一获取记录,并付给主变量,交由主语言进一步处理。游标分为显示游标和隐式游标,重点说显示游标。
这里不说游标与主语言的连接,只说游标的操作形式。
- 定义游标:将游标名与SQL查询结果相关联
- 打开游标:激活游标指针,指向缓冲区首部
- 提取当前结果到SQL变量中:将当前结果提取到主变量中,游标指针下移
- 关闭游标:断开关联,释放缓冲区空间
具体说游标操作之前,我们要先将查询结果列出,以用于select语句内容:
declare
v_deptid departments.department_id % type;
v_dname departments.department_name % type;
意义为:定义变量 v_deptid 与 v_dname,其属性类型与 department 中的 department_id 和 department_name 的类型相同。%type为关键字
下面给出部分属性表:
游标属性 | 描述 |
游标名 % ISOPEN | 值为bool型,若游标已打开,取值为TRUE |
游标名 % NOTFOUND | 值为bool型,如果最近一次fetch操作没有返回结果,则取值为TRUE |
游标名 % FOUND | 值为bool型,如果最近一次fetch操作没有返回结果,则取值为FALSE,反之为TRUE |
游标名 % ROWCOUNT | 值为number型,值是到当前为止返回的记录数 |
定义游标:
cursor 游标名[(参数名1 数据类型),......] is select 语句;
例如:
cursor C1 is select empolyee_id, department_id from empolyees;
完整写下来就是:
declare:
v_deptid departments.department_id % type;
v_dname departments.department_name % type;
cursor c_dept is select * from departments --游标c_dept与查询结果相关联
where department_id = v_deptid and department_name = v_dname;
按理说,现在的v_deptid是没有意义的,因为作为一个变量,他没有任何值,所以我们要赋值:
declare v_deptid departments.department_id % type:=&p_deptid;
这里的p_deptid 是已经定义好的变量,需要输入值。&用法请见点击打开链接
打开游标:
open 游标名[(实际参数值1),.........]
例如:
open C1;
这项简单不必多说。
取值到变量:
fetch 游标名 into 变量1 [变量2······];
或:fetch 游标名 into PL/SQL_RECORD;
与select语句中列的数据类型,前后顺序要一致。
关闭游标:
close 游标名;
例如:
close C1;
不赘述。
实例以及更多内容请看:游标的操作(二)