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

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)将指针指向下一条记录

Oracle数据库开发必备利器之PL/SQL基础——游标

例子:查询并打印员工的姓名和薪水

/*
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;
/

Oracle数据库开发必备利器之PL/SQL基础——游标

例子:给员工涨工资

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;

Oracle数据库开发必备利器之PL/SQL基础——游标

游标的属性

%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个游标

查看默认游标数:
Oracle数据库开发必备利器之PL/SQL基础——游标

解释:

-- 切换到管理员
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基础——游标

Oracle数据库开发必备利器之PL/SQL基础——游标

以上内容来自于慕课网:Oracle数据库开发必备利器之PL/SQL基础
用到的表格数据下载:https://img.mukewang.com/down/55cb063600014aa500000000.zip