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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cckevincyh/article/details/81989259

游标

游标:就是一个结果集

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/password@192.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

猜你喜欢

转载自blog.csdn.net/cckevincyh/article/details/81989259
今日推荐