###1. 概念 在oracle数据库中,为了处理SQL数据集,涉及到的操作有:select,insert,update,delete,主要是select。oracle会在内存中分配一块缓冲区,这个缓冲区存储了已经处理完的数据行集,游标就是一个指针,指向这个数据集,利用游标可以处理整个数据集。 ###2. 游标分类 | 操作类别 | 游标类型| |--------|---------| | 非select| 隐式游标| |Select 结果是单行|隐式/显示| |Select 结果是多行| 显示| ###3. 游标属性
- ####显式游标
属性 | 说明 |
---|---|
cursor_name %FOUND | 布尔类型,提取数据成功返回TRUE |
cursor_name %NOTFOUND | 与FOUND相反 |
cursor_name %ISOPEN | 布尔类型,游标打开成功返回TRUE |
cursor_name %ROWCOUNT | 数值类型,返回已从游标读取的记录数 |
- ####隐式游标
属性 | 说明 |
---|---|
SQL %FOUND | 布尔类型,提取数据成功返回TRUE |
SQL %NOTFOUND | 与FOUND相反 |
SQL %ISOPEN | 布尔类型,游标打开成功返回TRUE |
SQL%ROWCOUNT | 数值类型,返回影响的行数。select:只能是1行;insert:插入的行数;update:更新的行数;delete:删除的行数 |
4. 显式游标使用步骤
- 声明游标
CURSOR cursor_name[(参数)] [返回值] IS select语句
+ 打开游标
OPEN cursor_name
+ 提取并处理数据
```oracle
方式1:
LOOP
FETCH cursor_name INTO record_list;
.....
END LOOP;
方式2:
FOR record IN record_list
LOOP
....;
END LOOP;
fetch每次返回一个数据行,可以通过cursor_name%FOUND来判断数据是否遍历结束
- 关闭游标
CLOSE cursor_name
例子
fetch方式:
DECLARE
CURSOR c_name
is
select * from student;
var c_name % ROWTYPE; #定义变量var
BEGIN
OPEN c_name;
LOOP
FETCH c_name into var;
EXIT WHEN c_name % NOTFOUND;
DBMS_OUTPUT.put_line(var.name);
END LOOP
CLOSE c_name;
END;
for方式:
DECLARE
CURSOR c_name
IS
select * from student;
BEGIN
FOR var IN c_name
LOOP
DBMS_OUTPUT.put_line(var.name);
END LOOP
END;
for方式中,游标的open ,close都是隐式调用了。
带有输入参数
DECLARE
CURSOR c_name(s integer)
IS
select * from student where mark > s; #分数大于s的学生
BEGIN
FOR var IN c_name(60)
LOOP
DBMS_OUTPUT.put_line(c_name%ROWCOUNT||"记录:"|| var.name|| ":"|| var.mark);
END LOOP;
END;
###5. 隐式游标使用
隐式游标的名字为SQL,由oracle系统自定义,用户只能通过隐式游标的相关属性来完成特定的操作。 ####例子 查看更新操作,数据库表变化的行数
BEGIN
update student set mark=60 where mark < 60;
DBMS_OUTPUT.put_line(SQL%ROWCOUNT);
END;