Oracle数据库开发必备利器之PL/SQL基础——游标
程序员文章站
2022-04-21 15:02:52
...
游标
游标:就是一个结果集
CURSOR 光标名[(参数名 数据类型[,参数名 数据类型]...)]
IS SELECT 语句;
例如 cursor c1 is select ename from emp;
从游标中取值
1.打开游标: open c1;
打开光标执行查询
2.关闭游标: close c1;
关闭游标释放资源
3.取一行光标的值: fetch c1 into pename;
取一行到变量中
fetch的作用:
1)把当前指针指向的记录返回
2)将指针指向下一条记录
例子:查询并打印员工的姓名和薪水
/*
1、游标的属性
%found %notfound
*/
set serveroutput on
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;
-- 思考:1.循环什么时候退出?2.fetch不一定能取到记录
-- exit when 没有取到记录
--没有取到记录循环退出
exit when cemp%notfound;
dbms_output.put_line(pename||'的薪水是'||psal);
end loop;
--关闭游标
close cemp;
end;
/
例子:给员工涨工资
set serveroutput on
declare
-- 定义游标代表给哪些员工涨公司
cursor cemp is select empno,empjob from emp;
pempno emp.empno%type;
pempjob emp.empjob%type;
begin
--rollback;
--打开游标
open cemp;
loop
--取出员工
fetch cemp into pempno,pempjob;
exit when cemp%notfound;
-- 判断员工的职位
if pempjob = 'PRESIDENT' then update emp set sal=sal-2000 where empno=pempno;
elsif pempjob = 'MANAGER' then update emp set sal=sal-1600 where empno=pempno;
else update emp set sal=sal-800 where empno=pempno;
end if;
end loop;
--对于oracle,默认的事务隔离级别是read committed
-- 事务的ACID:原子性,一致性,隔离性,持久性
commit;
dbms_output.put_line('涨工资完成');
--关闭游标
close cemp;
end;
游标的属性
%found %notfound
%isopen; 判断游标是否打开 true / false
%rowcount; 影响的行数
set serveroutput on
declare
cursor cemp is select empno,empjob from emp;
pempno emp.empno%type;
pjob emp.empjob%type;
begin
open cemp;
if cemp%isopen then dbms_output.put_line('游标已经打开');
else dbms_output.put_line('游标没有打开');
end if;
loop
fetch cemp into pempno,pjob;
exit when cemp%nofound;
dbms_output.put_line('rowcount:'||cemp%rowcount);
end loop;
close cemp;
end;
/
游标数的限制
默认情况下,Oracle数据库只允许在同一个回话中,打开300个游标
查看默认游标数:
解释:
-- 切换到管理员
show user
conn sys/aaa@qq.com192.168.56.101:1521/orcl as sysdba
show parameter -- 做的是模糊查询
show parameter cursor
-- 修改游标数的限制
alter system set open_cursors=400 scope=both;
scope的取值:both、memory(只更改当前实例,不更改参数文件)、spfile(只更改参数文件,不更改当前实例,数据库需要重启才会生效)
带参数的游标
带参数的光标 : 定义的时候声明这个形参,然后在打开光标的是传个实参进入。
以上内容来自于慕课网:Oracle数据库开发必备利器之PL/SQL基础
用到的表格数据下载:https://img.mukewang.com/down/55cb063600014aa500000000.zip
上一篇: oracle 12c to_char 函数(1) 日期-字符串
下一篇: matplotlib条形图