pl/sql游标

游标就是一个结果集(Result Set)

--使用游标查询所有员工的姓名和薪水,并打印
/*
1.游标的属性 %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;
--给员工涨工资,总裁1000,经理800,其他400
DECLARE
 --定义游标代表给哪些员工涨工资
 CURSOR cemp IS SELECT empno,job FROM emp;
 pempno emp.empno%TYPE;
 pjob   emp.job%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;
 --oracle默认的事务隔离级别是 read committed
 COMMIT;
 dbms_output.put_line('涨工资完成');
  
END;

游标的属性和游标数的限制

/*
1.游标的属性
  %found %notfound
  %isopen:判断游标是否打开
  %rowcount:影响的行数
2.游标数的限制
show parameter cursor

NAME                                 TYPE
------------------------------------ ----------------------
VALUE
------------------------------
cursor_sharing                       string
EXACT
cursor_space_for_time                boolean
FALSE
open_cursors                         integer
300
session_cached_cursors               integer
50
修改游标数的限制:
alter system set open_cursors=400 scope=both;
scope的取值:both,memory,spfile(数据库需要重启);
*/
DECLARE
 --定义游标
 CURSOR cemp IS SELECT empno,job FROM emp;
 pempno emp.empno%TYPE;
 pjob   emp.job%TYPE;
BEGIN  
 --打开游标
 OPEN cemp;
 IF cemp%ISOPEN then 
  dbms_output.put_line('游标已经打开');
 ELSE
  dbms_output.put_line('游标没有打开');
 END IF;
 --关闭游标
 CLOSE cemp; 
END;



DECLARE
 --定义游标
 CURSOR cemp IS SELECT empno,job FROM emp;
 pempno emp.empno%TYPE;
 pjob   emp.job%TYPE;
BEGIN  
 --打开游标
 OPEN cemp;
 LOOP
 --取出一条记录
 FETCH cemp INTO pempno,pjob;
 EXIT WHEN cemp%NOTFOUND;
 --打印rowcount的值
 dbms_output.put_line('rowcount:'||cemp%ROWCOUNT);
 END LOOP;
 --关闭游标
 CLOSE cemp; 
END;

rowcount:1
rowcount:2
rowcount:3
rowcount:4
rowcount:5
rowcount:6
rowcount:7
rowcount:8
rowcount:9
rowcount:10
rowcount:11
rowcount:12
rowcount:13
rowcount:14
--查询某个部门中员工的姓名
DECLARE
 --定义带参数的游标
 CURSOR cemp(dno NUMBER) IS SELECT ename FROM emp WHERE deptno=dno;
 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;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值