EXIT WHEN EXIT_CONDITION;
END LOOP;
9.迭代控制------CONTINUE语句
只有当处于循环中时,CONTINUE和CONTINUE WHEN语句才会有效,当处于循环之外时,会带来语法错误。为避免这个错误,可以使用RETURN语句。
CONTINUE和CONTINUE WHEN语句适用于所有类型的循环
a. 与EXIT类似的:
IF CONTINUE_CONDITION THEN
CONTINUE;
END IF;
b.与EXIT WHEN类似:
CONTINUE WHEN CONTINUE_CONDITION;
10.显式游标--低级
处理显式游标的步骤:
a.声明游标:在内存中建立游标的初始化环境
eg:
DECLARE CURSOR c_student is select firstname||' '||last_name name FROM student
注:声明记录类型: vr_student c_student%ROWTYPE .与游标c_student的类型一致
b.打开游标:打开被声明的游标,并分配内存
eg:
OPEN c_student
c.检索游标:从被声明与打开的游标检索数据
eg:
方式一:
LOOP
FETCH c_student INTO vr_student;
DBMS_OUTPUT.PUTLINE(vr_student.name);
EXIT WHEN c_student%NOTFOUND;
END LOOP;
方式二:
FOR vr_student IN c_student
LOOP
...
END LOOP;
d.关闭游标:释放所分配的内存
CLOSE c_student;
显式游标属性:
%NOTFOUND cursor_name%NOTFOUND boolean类型
%FOUND cursor_name%FOUND boolean类型
%ISOPEN cursor_name%ISOPEN boolean类型
11.显式游标----高级
a.传参
eg:
CURSOR c_zip(p_state IN zipcode.state%TYPE) is
SELECT ZIP,CITY,STATE
FROM ZIPCODE
WHERE STATE=p_state
传参方式:
OPEN c_zip('NY')
或者
FOR r_zip IN c_zip('NY')
LOOP
.....
b. FOR UPDATE:当希望使用游标来更新数据库的表时,只能使用FOR UPDATE字句。目的是锁定希望更新的数据库表中数据行
语法: FOR UPDATE OF
eg:
1.declare cusrsor c_course is select course_no,cost from course for update
2.declare cusrsor c_course is select course_no,cost from course for update of phone 只更新表course中的phone字段
c.WHERE CURRENT OF 与 FOR CURRENT OF
当希望更新最新检索的数据行时,可以使用FOR CURRENT OF。只能在FOR UPDATE OF 游标中使用WHERE CURRENT OF 。WHERE CURRENT OF字句的好处是,免于在UPADATE语句中使用WHERE字句。
eg:
DECLARE CURSOR c_stud_zip IS select s.student_id,z.city FROM student s, zipcode z WHERE z.city='BROOKLYN' AND s.zip=z.zip FOR UPDATE OF phone
BEGIN
FOR r_stud_zip IN c_stud_zip
LOOP
UPDATE STUDENT SET PHONE='123'||SUBSTR(phone,4)
WHERE CURRENT OF c_stud_zip;
END LOOP;
END;
13.引用游标
DECLARE
TYPE cusor_type IS REF CURSOR [RETURN return_type];
cursor_variable cursor_type
single_record return_type;
BEGIN
OPEN cursor_variable FOR query_definition (eg:select * from empdfn) [USING bind_argument1,bind_argument2,...];
LOOP
FETCH cur