1、游标简介
使用游标,可以每次一行地检索和处理select语句所返回的数据行。命名游标,目的是方便引用。
2、隐式游标
无论何时sql语句执行,当该sql语句不存在显式有标时,任何特定PL/SQL语句块都会产生一个隐式游标。游标自动地与每个DML(数据操作)语句(update、delete和insert)建立关联。所有update和delete语句都有标识被当前操作所影响数据行集合的游标。insert语句需要存储位置来接收即将插入数据库的数据,隐式游标可以满足这个需求。最近一次被打开的游标被称为sql游标。
3、显式游标
1)声明游标。这会在内存中建立游标的初始化环境
2)打开游标。打开被声明的游标,并分配内存。
3)检索游标。现在,被声明和打开的游标能够检索数据。
4)关闭游标。被声明、打开和检索使用后的游标被关闭,以释放所分配的内存。
基于表的记录就是该记录的结构来自于数据库表中某些字段的列表,基于游标的记录是记录的数据结构匹配预定义游标的元素。为创建一个基于表或者基于游标的记录,可以使用%rowtype属性。
DECLARE
c_name test01%ROWTYPE;
BEGIN
SELECT * INTO c_name FROM test01 WHERE id >2;
DBMS_OUTPUT.put_line (
c_name.id || '===' || c_name.name || '====' || c_name.addtime);
END;
DECLARE
CURSOR c_test IS SELECT * FROM test01;
c_name test01%ROWTYPE;
BEGIN
OPEN c_test;
LOOP
FETCH c_test INTO c_name;
EXIT WHEN c_test%NOTFOUND;
DBMS_OUTPUT.put_line (
c_name.id || '==' || c_name.name || '=======' || c_name.addtime);
END LOOP;
CLOSE c_test;
END;
4、用户定义记录
是基于程序员定义的记录类型的,首先声明一个记录类型,然后基于前面的步骤中所定义的记录类型来声明记录变量;
type type_name is record
(field_name 1 datatype1,
field_name 2 datatype2
...
field_name n datatype n);
record_name type_name%rowtype;
5、游标的属性
--%notfound
语法:cursor_name%notfound
描述:一个boolean属性:当前面的fetch操作没有返回数据行时,该属性的值是ture,否则是false;
--%found
语法:cursor_name%found
描述:一个boolean属性:当前面的fetch操作返回一行数据时,该属性的值是ture,否则是false
--%rowcount
语法:cursor_name%rowcount
描述:从游标中所检索的记录数量
--%isopen
语法:cursor_name%isopen
描述:一个boolean属性:当游标处于打开状态时,则该属性的值是ture,否则是false;
6、有关游标的提示
游标select 列表
把select 列表与pl/sql变量或者pl/sql记录组件进行匹配。变量的数量必须等于select 列表中列或者表达式的数量。记录中组件的数量必须匹配select列表中列或者表达式。
游标作用范围
在主语句块(或者外围语句块)中所声明的游标的作用范围会扩展到子语句块。
游标select列表中表达式
pl/sql变量、表达式,甚至函数可以包含在游标select列表中。
游标中列的别名
别名是给select列表中列或者表达式所提供的代替名字。在显式的游标列种,在如下情况下,必须使用别名进行计算:
使用针对游标的%rowtype来检索记录。
希望引用程序中的别计算列。
/* 使用游标for循环和嵌套游标 */
DECLARE
CURSOR c_name IS SELECT * FROM test01 WHERE id < 5;
BEGIN
FOR v_name IN c_name
LOOP
UPDATE test01
SET stime = TO_DATE ('2018-10-10', 'yyyy-mm-dd')
WHERE id = v_name.id;
END LOOP;
commit;
END;
本公众号是个人学习工作笔记,希望大家发现问题能及时和我本人沟通,希望你与我共同成长。个人微信zgjt12306。
欢迎关注“自学Oracle”