游标是oracle执行sql 语句的内存区域。在数据库编程中,游标是内部数据结构,能够处理sql 查询结果。
SQL%ROWCOUNT 会返回被更新的数据行数。
为处理显式游标,首先需要声明它,然后打开它。接下来检索它,最后关闭它。
声明游标的语法:
CURSOR c_cursor_name IS select statement
记录类型:一个记录就是一个复合的数据结构,这意味着它由一个或者多个元素组成。记录非常类似于数据库表中一行数据,但是记录的每个元素并不会独立存在。PL/SQL 支持三种类型的记录:基于表的(table-based)、基于游标的(cursor-based)以及程序员定义的(programmer-based)。 基于表的记录就是该记录的结构来自于数据库表中某些字段的列表。 基于游标的记录是记录的数据结构匹配预定义游标的元素。为创建一个基于表或者基于游标的记录,可以 用%ROWTYPE 属性:
record_name table_name or cursor_name % ROWTYPE
如: DECLARE
vr_student student%ROWTYPE
BEGIN
SELECT * INTO vr_student from student where student_id=156;
DBMS_OUTPUT.PUT_LINE(vr_student.first_name|| ' ' || vr_student.last_name|| ' has an ID of 156');
EXCEPTION
WHEN no_data_found THEN
RAISE_APPLICATION_ERROR(-2001,'The Student is not in the database.');
END;
检索游标的方式:
FETCH cursor_name INTO PL/SQL variables;
或者
FETCH curso_name INTO PL/SQL record;
如:
DECLARE
CURSOR c_zip IS SELECT * from zipcode;
vr_zip c_zip %ROWTYPE;
BEGIN
OPEN c_zip;
LOOP
FETCH c_zip INTO vr_zip;
EXIT WHEN c_zip%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(vr_zip.zip || ' '|| vr_zip.city || ' ' || vr_zip.state);
END LOOP;
CLOSE c_zip; //关闭游标 释放 资源
END;
自定义记录类型 :
如: DECLARE
TYPE instructor_info IS RECORD
( first_name instructor.first_name%TYPE,
last_name instructor.last_name%TYPE,
sections NUMBER);
rv_instructor instructor_info
BEGIN
SELECT RTRIM(i.first_name),RTRIM(i.last_name),COUNT(*) INTO rv_instructor
from instructor i, section s where i.instructor_id=s.instruector_id
and i.instructor_id=102
GROUP BY i.first_name,i.last_name;
END;
显示 游标属性:
1.%NOTFOUND(cursor_name%NOTFOUND) :一个Boolean属性,当前面的FETCH操作没有返回数据行时,该属性的值是TRUE,否则是FALSE。
2.%FOUND (cursor_name%FOUND) : 一个Boolean 属性,当前面的FETCH操作返回一行数据时,该属性的值是TRUE,否则 是FALSE。
3.%ROWCOUNT (cursor_name%ROWCOUNT) : 从游标中所检索的记录数量
4.%ISOPEN (cursor_name%ISOPEN): 一个Boolean 属性:当游标处于打开状态时,则该属性的值是TRUE,否则 FALSE。