一、游标
是oracle系统在内存中开辟的一个工作区,在其中存放select语句返回的查询结果。
二、游标分类
2、显示游标
由用户显式声明,查询返回多行记录 不能对游标赋值,也不能在表达式中使用游标名
三、游标处理
3、将提取的行值存入一个PL/SQL record 中能方便地处理活动集中的行
四、示例代码
1、隐式游标
--简单用法
begin
for emprow in (select * from emp where deptno = 10) loop
dbms_output.put_line(emprow.empno);
dbms_output.put_line(emprow.ename);
end loop;
end;
-- sql%rowcount ,最近执行的SQL 影响行数,部门号为20
begin
update emp set sal = sal where deptno = 10;
update emp set sal = sal where deptno = 20;
dbms_output.put_line(sql%rowcount);
end;--1)loop方式
declare
--1.定义游标
cursor emp_dept10_cur is
select * from emp where deptno = 10;
emprow emp%rowtype;
begin
if emp_dept10_cur%isopen then --未打开,不执行
dbms_output.put_line(‘1游标已经打开‘);
end if;
--2.打开游标
open emp_dept10_cur ;
if emp_dept10_cur%isopen then --已打开,执行
dbms_output.put_line(‘2游标已经打开‘);
end if;
--3.读取行记录,先fetch 在读取单行记录
loop
fetch emp_dept10_cur into emprow ;
exit when emp_dept10_cur%notfound;
dbms_output.put_line(emprow.empno);
dbms_output.put_line(emprow.ename);
end loop;
--4.关闭游标
close emp_dept10_cur;
end;
--2)whle 方式
declare
cursor emp_dept10_cur is
select * from emp where deptno = 10;
emprow emp%rowtype;
begin
open emp_dept10_cur;
fetch emp_dept10_cur into emprow;
while(emp_dept10_cur%found) loop --emp_dept10_cur 有值 继续循环
dbms_output.put_line(emprow.empno);
dbms_output.put_line(emprow.ename);
fetch emp_dept10_cur into emprow;
end loop;
close emp_dept10_cur;
end; --游标定义 、打开、提取、关闭 一体化
declare
cursor emp_dept10_cur is
select * from emp where deptno = 10;
begin
for emprow in emp_dept10_cur loop
dbms_output.put_line(emprow.empno);
dbms_output.put_line(emprow.ename);
end loop;
--再次打开,遍历游标
for emprow in emp_dept10_cur loop
dbms_output.put_line(emprow.empno);
dbms_output.put_line(emprow.ename);
end loop;
end;
--1、带参方式(一)
declare
cursor emp_dept_cur is
select * from emp where deptno = &dno;
begin
for emprow in emp_dept_cur loop
dbms_output.put_line(emprow.ename);
end loop;
end;
--2、带参方式(二)
declare
cursor emp_dept_cur( dno int ) is
select * from emp where deptno = dno; --有参数的游标
begin
for emprow in emp_dept_cur(&dno) loop
dbms_output.put_line(emprow.empno);
end loop;
end;
--3、显示开/关游标
declare
cursor emp_dept_cur(dno int) is
select * from emp where deptno = dno;
emprow emp%rowtype;
begin
--选择10号部门的员工
open emp_dept_cur(10);
loop
fetch emp_dept_cur into emprow;
exit when emp_dept_cur%notfound;
dbms_output.put_line(emprow.empno);
dbms_output.put_line(emprow.ename);
end loop;
close emp_dept_cur;
--选择20号部门的员工
open emp_dept_cur(20);
loop
fetch emp_dept_cur into emprow;
exit when emp_dept_cur%notfound;
dbms_output.put_line(emprow.empno);
dbms_output.put_line(emprow.ename);
end loop;
close emp_dept_cur;
end;
/*
在一个块中分别显示薪水低于2000,在2000与4000之间,以
及大于4000的雇员名.
*/
declare
cursor emp_cursor(s_sal number,e_sal number) is
select ename from emp where sal between s_sal and e_sal;
begin
FOR emp_record IN emp_cursor(0,2000) LOOP
dbms_output.put_line(‘薪水低于2000的用户是:‘||emp_record.ename);
end loop;
dbms_output.put_line(‘===================================‘);
FOR emp_record IN emp_cursor(2000,4000) LOOP
dbms_output.put_line(‘薪水大于2000,低于4000的用户是:‘||emp_record.ename);
end loop;
dbms_output.put_line(‘===================================‘);
FOR emp_record IN emp_cursor(4000,1000000) LOOP
dbms_output.put_line(‘薪水大于4000的用户是:‘||emp_record.ename);
end loop;
end;
原文:http://blog.csdn.net/leovnay/article/details/18738151