欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

pl/sql游标

程序员文章站 2024-01-13 19:34:52
...

游标就是一个结果集(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;

 

相关标签: plsql