光标(cursor)
cursor 游标名
定义光标
cursor 光标名称 is select 要用光标查询的列 from 查询的表
open 光标名字
close 光标名字
光标属性
%isopen %rowcount 影响行数
%found %notfound 是否有 值
-- 查询并打印
/**
光标的属性: %isopen %rowcount 影响行数
%found %notfound
*/
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 ;
-- 没有取到记录退出
exit when cemp%notfound ;
dbms_output.put_line(pename||'的薪水是'||psal);
end loop ;
close cemp ;
-- 关闭
end;
加薪问题
-- 给不同额员工涨工资
declare
-- 定义光标
cursor cemp is select empno,job from emp ;
-- 定义引用变量
pempno emp.ename%type ;
pjob emp.job%type ;
begin
-- 把之前的事务没有提交的回滚掉
rollback ;
-- 打开
open cemp ;
--开启循环
loop
fetch cemp into pempno,pjob ;
exit when cemp%notfound ;
end loop ;
-- 判断职位
if pjob='CLERK' then update emp set sal=sal+1000 where empno=empno ;
elsif pjob=' MANAGER' then update emp set sal=sal+800 where empno=empno ;
else update emp set sal=sal+400 where empno=empno ;
end if ;
-- 结束循环
-- 关闭
close cemp ;
-- 提交事务 -- why ? ? oracle 默认的隔离级别,read_commit ACID 两个客户端,
commit ;
dbms_output.put_line('加薪完毕老板!');
end;
带参数的光标
-- 带参数的光标
declare
-- 创建带参数的指针
cursor cemp(dno number) is select ename from emp where deptno=dno;
-- 定义一个和ename类型的变量
pename emp.ename%type ;
begin
-- 打开指针
open cemp(20) ;
-- 循环
loop
fetch cemp into pename ;
-- 退出条件
exit when cemp%notfound;
-- 打印输 出
dbms_output.put_line(pename);
end loop ;
-- 结束指针
close cemp;
end;
1.定义指针
cursor cursorname(parm) is from 列名 for 表名 where 条件 ;
open 指针名字(传参)
调动指针 fetch 指针名字 into 列名
close 指针名字;