《PL/SQL 语言开发参考手册》之五:PL/SQL 游标
《PL/SQL 语言开发参考手册》下载地址
1、游标(CURSOR)
游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用 fetch 语句可以移动该指针,从而对游标中的数据进行各种操作,然后将操作结果写回数据表中。
1)分类:
a)显式游标:程序员可以操作控制,是针对 select 语句的,指向 select 语句的结束集;
b)隐式游标:程序员不可控制,但可以有限制的应用;
2)作用:用于处理查询语句的结果,提取多行数据集;
3)使用步骤:
a)声明游标:
a、普通声明:
DELCARE v_emp s_emp%ROWTYPE; v_did s_dept.id%TYPE; CURSOR cur_emp IS select * FROM s_emp WHERE dept_id =v_did; /* CURSOR的内容必须是一条查询语句 */
b、带参数声明明:
DELCARE CURSOR c_emp(v_did s_emp.ID%TYPE) SELECT * FROM s_emp WHERE dept_id = v_did;
b)为查询打开游标:
OPEN cur_emp; /* 相当于执行select语句,且把执行结果存入CURSOR;
c)从游标中取结果,存入 PL/SQL 变量中:
a、FETCH cur_emp INTO var1, var2, ...(变量名 1, 变量名 2,.......); /* 变量的数量、类型、顺序要和Table中字段一致; */
b、FETCH cur_emp INTO record_var(记录型变量名);
注:将值从 CURSOR 取出放入变量中,每 FETCH 一次取一条记录;
d)关闭游标:CLOSE cur_emp;
注:
a、游标使用后应该关闭;
b、关闭后的游标不能 FETCH 和再次 CLOSE;
c、关闭游标相当于将内存中 CURSOR 的内容清空;
2、游标的属性
游标名%属性名
1)%FOUND:是否有值;有则返回 TRUE,否则返回 FALSE;
2)%NOTFOUND:是否没有值;如果没有值则返回 TRUE,否则返回 FALSE;
3)%ISOPEN:是否是处于打开状态;处于打开状态就返回 TRUE,否则返回 FALSE;
4)%ROWCOUNT:CURSOR 当前的记录号(当前游标的指针位移量,表示在此之前,游标所处理的数据量(多少条记录));
3、游标的 FETCH 循环
1)
LOOP FETCH 游标名 INTO 定义的变量 EXIT WHEN 游标名%NOTFOUND; /* 当游标没取道记录后退出 要及时的做出判断 */ END LOOP;
2)
WHILE 游标名%FOUND LOOP FETCH 游标名 INTO 定义的变量; END LOOP;
3)
FOR 保存数据的变量(不用事先定义,是根据游标声明的时候SELECT 的类型来确定) IN 游标名 LOOP (FETCH 游标名 INTO ...) (可以不用FETCH 语句) END LOOP;
4、带参数的游标 CURSOR
DECLARE v_emp s_emp%ROWTYPE CURSOR cur_emp(p_did s_emp.dept_id%TYPE) IS /* 定义参数p_did的类型 */ SELECT * FROM s_emp WHERE dept_id= p_did FOR UPDATE OF salary; /*FOR UPDATE OF salary; 加行级锁,在我修改这些数据的时候, *其他人无法修改数据,直到游标被CLOSE后 */ BEGIN OPEN cur_emp(31); /*带的参数值 31 就是赋给参数p_did 的 */ LOOP FETCH cur_emp INTO v_emp; EXIT WHEN cur_emp%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_emp.id||' '||v_emp.first_name); END LOOP; CLOSE cur_emp; END
5、显式游标与隐式游标
显式游标主要是用于对查询语句的处理,尤其是在查询结果为多条记录的情况下;
而对于非查询语句,如修改、删除操作,则由 ORACLE 系统自动地为这些操作设置游标并创建其工作区,这些由系统隐含创建的游标称为隐式游标,隐式游标的名字为 SQL,这是由 ORACLE 系统定义的。
对于隐式游标的操作,如定义、打开、取值及关闭操作,都由 ORACLE 系统自动地完成,无需用户进行处理。
用户只能通过隐式游标的相关属性,来完成相应的操作。
在隐式游标的工作区中,所存放的数据是与用户自定义的显示游标无关的、最新处理的一条 SQL 语句所包含的数据。
格式调用为: SQL%
注:INSERT,UPDATE,DELETE,SELECT 语句中不必明确定义游标。
隐式游标属性
SQL%FOUND 布尔型属性,当最近一次读记录时成功返回,则值为 true;
SQL%NOTFOUND 布尔型属性,与 %found 相反;
SQL %ROWCOUNT 数字型属性,返回已从游标中读取得记录数;
SQL %ISOPEN 布尔型属性,取值总是 FALSE。SQL 命令执行完毕立即关闭隐式游标。