光标 就是一个结果集 相当于java中的resultset
语法: cursor 光标名 [(参数名 数据类型【参数名 数据类型】...)] is select 语句;
打开光标-- open c1;
关闭光标-- close c1;
取一行光标的值-- fetch c1 into 变量名;(取一行到变量中)
光标的属性
%found
%notfound
案例-1 使用光标查询员工姓名和工资,并打印
set serveroutput on
declare
--定义一个光标
cursor cemp is select ename,sal from emp;
--为光标定义对应的变量
pename emp.ename%type;
psal emp.sal%type;
begin
--打开光标
open cemp;
loop
--取一条记录
fetch cemp into pename,psal;
--循环什么时候退出?fetch语句不一定能取到记录
exit when cemp%notfound;
--打印
dbms_output.put_line(pename||'的薪水是'||psal);
end loop;
--关闭光标
close cemp;
end;
/
实例:给员工涨工资
set serveroutput on
declare
--定义光标代表给哪些员工涨工资
cursor cemp is select empno,empjob from emp;
pempno emp.empno%type;
pjob emp.empjob%type;
begin
rollback;
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;
end if;
end loop;
close cemp;
--对于oracle默认的事务隔离级别是read commited
--事务的ACID: 原子性 一致性 隔离性 持久性
commit;
dbms_output.put_line('涨工资完成');
end;
/
光标的属性
%found %notfound %isopen判断光标是否打开 %rowcount影响的行数
光标的限制
默认情况下oracle数据库只允许在同一个会话中,打开300个光标
修改系统的参数设置
alter system set open_cursors=400 scope=both;
scope的取值:both memory spfile(数据库需要重启)
带参数的光标
语法: 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;
end loop;
end;
/