Oracle数据库学习笔记之游标

时间:2022-11-07 08:39:37
游标(光标):用来处理数据库中临时得到的数据,默认情况下Oracle数据库之允许在同一个会话中,打开300个光标
连接到system as sysdba 使用show parameter cursor可以查看到默认光标数(show parameter查看关键词的参数设置)
alter system set open_cursors=400 scope=both; --scope的取值memory(只更改当前值,不更改参数文件),spfile(只更改参数文件,不更改当前值,数据库需要重新启动才可生效),both(当前值和参数文件同时更改)


游标的分类
隐式游标--系统提供
执行更新,删除,添加和查询一条数据
隐式游标属性
(1)sql%rowcount 执行DML操作时返回的行数  返回整形
(2)sql%found 值是true表示操作成功
(3)sql%notfound: 和sql%found相反
(4)sql%isopen:游标是否是打开状态
没有参数的游标
(1)声明游标:
cursor 游标名 is select 语句;
(2)打开游标
open 游标名;
(3)关闭游标
close 游标名; 
(4)取出游标的值
fetch 游标名 into 变量;
(5)显示游标的属性  游标名%属性
%rowcount 返回执行行数
%found 最近一条fetch语句是否取到结果 返回true有结果
%notfound 同%found相反
%isopen 游标是否打开


例:使用游标循环输出所有人的姓名和工资
declare 
 c_ename emp.ename%type;
 c_sal   emp.sal%type;
 cursor c_emp is select ename,sal from emp;
begin 
 open c_emp;
 loop
  fetch c_emp into c_ename,c_sal;
  dbms_output.put_line(c_ename||','||c_sal);
  exit when c_emp%notfound;
 end loop;
 close c_emp;
end;


带参数的游标
声明:
cursor 游标名(变量名 数据类型,...) is select语句;
打开游标传入参数
open 游标名(实参);
注:参数设置数据类型时不指定长度


变量传递参数给游标
注:打开游标前给变量赋值;


例:--变量传参给游标  --根据job 和deptno查询员工empno 和ename
declare
    cursor emp_info(ujob varchar2,udeptno number) is 
    select empno,ename from emp where job=ujob and deptno=udeptno;
    uname emp.ename%type;
    uno   emp.empno%type;
begin
--打开游标前给变量赋值 (ujob:='ANALYST';udeptno:=20;)或直接在open的时候赋值
  open emp_info('ANALYST',20);
  loop
    fetch emp_info into uno,uname;
    exit when emp_info%notfound;
    dbms_output.put_line(uno||','||uname);
    end loop;
    close emp_info;
end;