光标
就是一个结果集(Result Set)
光标的语法
CURSOR 光标名 [(参数名 数据类型[,参数名 数据类型]…)]
IS SELECT 语句;
一个具体的光标
cursor c1 is select ename from emp;
c1这个光标存放了emp表里所有的ename集合
打开光标
open c1;(打开光标执行查询)
关闭光标
close c1;(关闭光标释放资源)
取一行光标的值
fetch c1 into pename;(取一行到变量中)
光标的属性
1、
%found:是否找到
%notfound:是否没找到
%isopen:判断光标是否打开
%rowcount:影响的行数
2、光标数的限制:默认情况下,oracle数据库只允许在同一个会话中,打开300个光标,所以开启光标记得关闭。
3、修改光标数的限制:alter system set open_cursors=400 scope=both;
scope的取值:
both:实例和参数文件都会被更改
memory:只更改当前实例,不更改参数文件
spfile(数据库需要重启):只更改参数文件,不更改当前实例
例:
--查询并打印员工的姓名和薪水
set serveroutput on
declare
--定义一个光标
cursor cemp is select ename,sal from emp;
--为光标定义对应的变量
pename emp.enmae%type;
psal emp.sal%type;
begin
--打开光标
open cemp;
loop
--取一条记录
fetch cemp into pename,psal;
exit when cemp%notfound;
--打印
dbms_output.put_line(pename||’的薪水是’||psal);
end loop;
--关闭光标
close cemp;
end;
/
例:
--按员工的职位涨工资,总裁涨1000元,经理涨800元,其他人员涨400元。
set serveroutput on
declare
--定义光标代表给哪些员工涨工资
cursor cemp is select empno.empjob from emp;
pempno emp.empno%type;
pjob emp.empjob%type;
begin
--打开光标
open cemp;
loop
--取出一个员工
fetch cemp into pempno,pjob;
exit when cemp%notfound;
--判断员工的职位
if pjob=’PRESIDENT’ then update emp set sal=sal+1000 where empno=pempno;
elsif pjob=’MANAGER’ then update emp set sal=sal+800 where empno=pempno;
else update emp set sal=sal+400 where empno=pempno;
end if;
end loop;
--关闭光标
close cemp;
commit;
end;
/
带参数的光标
CURSOR 光标名[(参数名 数据类型[,参数名 数据类型]…)]
IS SELECT 语句;
‘
例:查询某个部门中员工的姓名(传入部门编号,得到员工姓名)
set serveroutput on
declare
--定义带参数的光标
cursor cemp(dno number) is select ename from emp where deptno=dno;
pename emp.ename%type;
begin
--打开光标
open cemp(10);
loop
fetch cemp into pename;
exit when cemp%notfound;
dbms_output.put_line(pename);
end loop;
--关闭光标
close cemp;
end;
/