Oracle学习笔记第十二天-01
Oracle学习笔记第十二天-01
游标
概念: 游标是系统为用户开设的一个数据缓冲区,存放SQL 语句的执行结果,每个游标区都有一个名字。用户可以通过游标逐一获取记录
分类:
静态游标: 在编译时知道其SELECT 语句的游标
动态游标: 运行的时候动态决定执行何种查询
--语法
-- 声明游标
CURSOR cursor_name is query_sql;
-- 打开游标
OPEN cursor_name;
-- 提取游标
FETCH cursor_name INTO variable_list;
-- 使用FETCH语句实现对游标内容的读取
-- variable_list必须与从游标提取的结果集类型相同
-- 关闭游标
CLOSE cursor_name;
-- 使用CLOSE语句关闭一个游标
-- 关闭游标后,所有资源都将被释放
举例:先登录Scott用户
SET SERVEROUTPUT ON;
DECLARE
-- 定义一个游标
CURSOR c_emp IS SELECT * FROM emp;
-- 定义一个变量来接收游标读取出来的值
v_emp emp%ROWTYPE;
BEGIN
-- 先打开游标
OPEN c_emp;
-- 提取游标
FETCH c_emp INTO v_emp;
dbms_output.put_line('工号:'||v_emp.empno||
'姓名:'||v_emp.ename||
'工资:'||v_emp.sal);
CLOSE c_emp;
END;
/
这里只提取了一行,现在有个疑问就是怎么提取下一行,其实很简单,就是再次调用 提取游标 就可以提取下一行。
SET SERVEROUTPUT ON;
DECLARE
-- 定义一个游标
CURSOR c_emp IS SELECT * FROM emp;
-- 定义一个变量来接收游标读取出来的值
v_emp emp%ROWTYPE;
BEGIN
-- 先打开游标(此时执行查询sql,得到结果集)
OPEN c_emp;
LOOP
-- 提取一行数据
FETCH c_emp INTO v_emp;
-- 判断是否要退出循环。
EXIT WHEN c_emp%NOTFOUND;
dbms_output.put_line('工号:'||v_emp.empno||
'姓名:'||v_emp.ename||
'工资:'||v_emp.sal);
END LOOP;
CLOSE c_emp;
END;
/
属性 | 作用 |
---|---|
%found | 用于检验游标是否成功,通常在FETCH语句后使用,当游标按照条件查询出一条记录时,返回true |
%isopen | 判断游标是否处于打开状态,试图打开一个已经打开或者已经关闭的游标,将会出现错误,打开为true |
%notfound | 与%found的作用相反,当按照条件无法查询到记录时,返回true |
%rowcount | 循环执行游标读取数据时,返回检索出的记录数据的行数 ,当前取出来数据的行数 |
循环游标
它是使用显式游标最简单的方式。
-- 语法一:
for 记录名 in (游标名)
loop
end loop;
-- 语法二:
for 游标名 in (select 语句)
loop
end loop;
举例:
set serveroutput on;
declare
--定义游标(查询所有员工表的工号,姓名,工资)
cursor c_emp is select * from emp;
begin
for v_emp in c_emp loop
--输出
dbms_output.put_line('工号:'||v_emp.empno||
'姓名:'||v_emp.ename||
'工资:'||v_emp.sal);
end loop;
end;
/
set serveroutput on;
declare
begin
for v_emp in (select empno,ename,sal from emp) loop
--输出
dbms_output.put_line('工号:'||v_emp.empno||
'姓名:'||v_emp.ename||
'工资:'||v_emp.sal);
end loop;
end;
/
这两个循环游标是显示游标的简化版,在这些版本中,不用自己去定义变量来接收游标中的数据,不用自己手动打开游标,不用自己手动关闭游标。
在循环过程中会自动打开游标,循环完候会自动关闭游标。