cursor就是一个结果集,Result Set,可以从数据库中取出多个纪录。
cursor的使用:
光标赋值:cursor 光标名[(参数名 数据类型 [,参数名 数据类型])] is select语句;
或者:cursor 光标名 is select语句;
使用时,需要先打开:open 光标名; 使用完要关闭:close 光标名;
取一行光标的值:fetch 光标名 into 变量名;
fetch的作用:1、把当前指针指向的纪录返回
2、将指针指向下一条纪录
光标的属性:
%found 值:true, false
%notfound 值:true, false
%isopen 判断光标是否打开
%rowcount 影响的行数
光标数的限制:
默认情况下,Oracle数据库只允许在同一个会话中,打开300个光标。所以一般语句中使用光标结束后,要关闭光标。
修改光标数的限制:
alter system set open_cursor=400 scope=both;--改为400
scope的取值:both(同时更改memory和spfile), memory(只更改当前实例,不更改参数文件), spfile(只更改参数文件,不更改当前实例,数据库需要重启)
例(不带参数的光标):
set serveroutput on--打开屏幕输出开关
declare--声明
--定义一个光标
cursor cstu is select no,name from students;
--定义对应变量, 以students表中对应字段的属性类型定义
stuno students.no%type;
stuname students.name%type;
begin
--打开光标
open cstu;
--使用loop循环
loop
--光标初始指向第一天纪录,所以可以直接取一条纪录
fetch cstu into stuno, stuname;--赋值时,对应select语句中的属性顺序,stuno第一,stuname第二
--没取到纪录时退出循环
exit when cstu%notfound;
--打印
dbms_output.put_line(stuname||"的学号是"||stuno);--||是pl/sql中的连接符,相当于java中的+号?
end loop;
--关闭光标
close cstu;
end;
/--这个/在语句结束时要有
例(带参数的光标):
set serveroutput on--打开屏幕输出开关
declare--声明
--定义一个光标
cursor cstu(clano number) is select name from students where classno=clano;
--定义对应变量,
stuname students.name%type;
begin
--打开光标
open cstu(5);--打开5班的光标纪录
--使用loop循环
loop
--取学生姓名
fetch cstu into stuname;--赋值
--没取到纪录时退出循环
exit when cstu%notfound;
--打印
dbms_output.put_line(stuname);
end loop;
--关闭光标
close cstu;
end;
/--这个/在语句结束时要有