oracle游标

本文详细介绍了在 Oracle 数据库中如何使用 PL/SQL 的游标来遍历和处理查询结果集,包括基本的游标声明、打开、读取及关闭等操作,并提供了一个调整员工薪资的具体示例。

DECLARE

  --  声明游标

  CURSOR mycur IS  SELECT * FROM emp;

  empInfo emp%ROWTYPE;

  cou     NUMBER;

BEGIN

  --  游标操作使用循环,但是在操作之前必须先将游标打开

  FOR empInfo IN mycur LOOP

    cou := mycur%ROWCOUNT;

    DBMS_OUTPUT.put_line(cou || '雇员编号:' || empInfo.empno);

    DBMS_OUTPUT.put_line(cou || '雇员姓名:' || empInfo.ename);

  END LOOP;

END;


 ROWTYPE 类型,此类型表示可以把一行的数据都装进来。

emp%ROWTYPE;标示把emp一行的数据都装进来




DECLARE

  --  声明游标

  CURSOR mycur IS

    SELECT * FROM emp; -- List (EmpPo)

  empInfo emp%ROWTYPE;

BEGIN

  --  游标操作使用循环,但是在操作之前必须先将游标打开

  OPEN mycur;

  --  使游标向下一行

  FETCH mycur  INTO empInfo;

  --  判断此行是否有数据被发现  mycur%FOUND相当于resultset.hasNext() 判断是否有下一个

  WHILE (mycur%FOUND) LOOP

    DBMS_OUTPUT.put_line('雇员编号:' || empInfo.empno);

    DBMS_OUTPUT.put_line('雇员姓名:' || empInfo.ename);

    --  修改游标,继续向下

    FETCH mycur  INTO empInfo;----相当于result.next()

  END LOOP;

END;





===========================================


也可以使用另外一种方式循环游标:LOOP…END LOOP;
DECLARE
--  声明游标

CURSOR mycur IS SELECT * FROM emp ;
empInfo emp%ROWTYPE ;
BEGIN
--  游标操作使用循环,但是在操作之前必须先将游标打开
OPEN mycur ;
LOOP
--  使游标向下一行
FETCH mycur INTO empInfo ;
EXIT WHEN mycur%NOTFOUND ;
DBMS_OUTPUT.put_line('雇员编号:'||empInfo.empno) ;
DBMS_OUTPUT.put_line('雇员姓名:'||empInfo.ename) ;
END LOOP ;
END ;
/
注意 1:
在打开游标之前最好先判断游标是否已经是打开的。
通过 ISOPEN 判断,格式:游标%ISOPEN
IF mycur%ISOPEN THEN
null ;
ELSE
OPEN mycur ;
END IF ;
注意 2:
可以使用 ROWCOUNT 对游标所操作的行数进行记录。
DECLARE
--  声明游标
CURSOR mycur IS SELECT * FROM emp ;
empInfo emp%ROWTYPE ;
cou NUMBER ;
BEGIN
--  游标操作使用循环,但是在操作之前必须先将游标打开
IF mycur%ISOPEN THEN
null ;
ELSE
OPEN mycur ;
END IF ;
LOOP
--  使游标向下一行
FETCH mycur INTO empInfo ;
EXIT WHEN mycur%NOTFOUND ;
cou := mycur%ROWCOUNT ;
DBMS_OUTPUT.put_line(cou||'雇员编号:'||empInfo.empno) ;
DBMS_OUTPUT.put_line(cou||'雇员姓名:'||empInfo.ename) ;
END LOOP ;

END ;




一次性上涨全部雇员的工资。根据它所在的部门涨工资,规则:
• 10 部门上涨 10%
• 20 部门上涨 20%
• 30 部门上涨 30%
所有部门的上涨工资,最不能超过 5000,如果超过 5000,则工资就为 5000。
declare
cursor mycur is select * from emp;
empInfo emp%rowtype;
s emp.sal%type;
begin
for empInfo in mycur loop
if empInfo.deptno = 10 then
s := empInfo.sal*1.1;
elsif empInfo.deptno = 20 then
s := empInfo.sal*1.2;
elsif empInfo.deptno = 30 then
s := empInfo.sal* 1.3;
end if;
if s > 5000 then
s := 5000;
end if;
update emp set sal = s where empno = empInfo.empno;
end loop;
end;


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值