游标(光标):用来处理数据库中临时得到的数据,默认情况下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;