oracle储存过程--游标
*游标*
什么是游标
用于临时存储一个查询返回结果的多行数据(结果集:类似于java的jdbc连接返回的resultset集合),通过遍历游标,可以逐行访问处理该结果集的数据。
*游标的使用方式:声明--->打开--->读取--->关闭*
*语法*
*游标声明:*
Cursor 游标名[(参数列表)] is 查询语句;
游标的打开:open 游标名
游标的取值:
Fetch 游标名 into 变量列表
游标的关闭:
Close 游标名;
*游标的属性*
*其中,%notfound是在游标中找不到元素的时候返回true,通过那个用来判断退出循环*
*不带有参数的游标*
*小案例:*--使用游标查询emp表中所有员工的姓名和工资,并将其依次打印出来。****
**-- Created on 2020/12/12 by zyq**
declare
**--声明游标**
cursor c_emp is
select ename, sal from emp;
**--声明变量接收游标中的数据**
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
**--打开游标**
open c_emp;
**--遍历游标**
loop
**--获取游标中的数据**
fetch c_emp
into v_ename, v_sal;
**--退出循环条件**
exit when c_emp%notfound;
dbms_output.put_line(v_ename || '_' || v_sal);
end loop;
**--关闭游标**
close c_emp;
end;
*执行结果:*
SMITH_800
ALLEN_1600
WARD_1250
JONES_2975
MARTIN_1250
BLAKE_2850
CLARK_2450
SCOTT_3000
KING_5000
TURNER_1500
ADAMS_1100
JAMES_950
FORD_3000
MILLER_1300
*带有参数的游标*
*小案例:*--使用游标查询emp表中所有员工的姓名和工资,部门编号*为运行时手动输入。*****
**-- Created on 2020/12/12 by zyq**
declare
**--声明游标 带有参数**
cursor c_emp(v_deptno emp.deptno%type) is
select ename, sal from emp where deptno = v_deptno;
**--声明变量接收游标中的数据**
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
**--打开游标 传入参数**
open c_emp(10);
**--遍历游标**
loop
**--获取游标中的数据**
fetch c_emp
into v_ename, v_sal;
**--退出循环条件**
exit when c_emp%notfound;
dbms_output.put_line(v_ename || '_' || v_sal);
end loop;
**--关闭游标 不需要传参数了**
close c_emp;
end;
执行结果:
CLARK_2450
KING_5000
MILLER_1300
*注意: %notfound 属性默认值为false ,所以在循环中要注意判断条件的位置,如果先判断在fetch会导致最后一条记录的值被打印两次(多循环一次默认);*