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;