---- 第五章 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