游标
游标是sql的一个内存工作区,由系统或用户以变量的形式定义,用于临时存储从数据库中提取的数据块。
游标分为显式游标和隐式游标,可自定义显式游标用来存储多行多列的数据。
显式游标一旦打开,就相当于执行了select语句,执行的结果集就存储在游标中。
隐式游标
在进行DML操作和单行SELECT语句(select...into...)数据库会自动使用隐式游标,可通过调用隐式游标变量直接取值,隐式游标只存储单个数据。
四个隐式游标:
sql%rowcount:整型,用于记录DML语句成功修改记录的条数。
sql%found:布尔型,true表示crud的操作成功。
sql%notfount:布尔型,与sql%found属性的值相反。
sql%isopen:布尔型,DML执行过程中为true,执行结束后为false。
显式游标
使用步骤:
1.声明游标
在declear声明,
语法:
corsor 游标名[参数1 数据类型[,参数2 数据类型...]] is select语句;
2.打开游标
游标在使用前必须打开;
open 游标名[(参数1[,参数2.....])];--相当于执行is后面的select语句,并把查询结果存入游标中。
3.提取数据
fetch 游标名 into 变量1[,变量2....];--取一条(row)数据到变量中,变量的个数和类型要和select语句中字段变量的个数和类型一致。
游标打开后有一个指针指向数据区,fetch语句每一次返回一行的数据,每次执行完指针指向下一行。可通过循环实现返回多行数据,控制循环可通过游标的属性%found和%notfount控制。
4.关闭游标
close 游标名;
游标关闭后占用的资源就被释放,游标变为无效。
显式游标必须手动关闭,显式游标打开的数量有限制,默认为300,超过限制会报错:ORA-01000: maximum open cursors exceeded
使用游标的属性,在游标名后面带上属性以取得属性的值。如:游标名%FOUND;
%FOUND:指针当前指向数据区有数据时为true,无数据为false;
%NOTFOUND:与%found相反,无数据为true;
%ISOPEN:当前游标已打开为true,未打开为false;
%ROWCOUNT:已从游标中取出的数据的行数;
游标变量(动态游标)ref cursor:
游标变量和普通游标基本相同,不同之处在于游标变量更加灵活,在声明时不需要绑定查询,并且游标变量没有参数。
游标变量分为强类型和弱类型
强类型:列的数量和列的数据类型在定义游标变量时即定义好。
弱类型:定义游标变量时不定义列的数据的类型,在游标被打开时再确定每列的数据类型和列的数量,游标的列数量和列的数据类型一旦被确定不能再更改。
用法:
1.声明动态游标类型
弱类型,不指定return type:type cur_type is ref cursor;
强类型,指定return type:type cur_type is ref cursor return 表名%rowtype;
2.声明自定义的动态游标类型的变量:游标名 cur_type;
3.打开动态游标:open 游标名 for select语句;
4.获取游标中的数据:fatch 游标名 into 变量1[,变量2....];
5.关闭游标:close 游标名;
使用动态游标的实例:
set serveroutput ondeclare type re_type is record( name varchar2(200) ); type ref_cursor is ref cursor return re_type; c1 ref_cursor; message varchar2(200);begin open c1 for select name from t_test; loop fetch c1 into message; exit when c1%notfound; dbms_output.put_line('第'||c1%rowcount||'个:'||message); end loop; close c1;end;
数据库中关于游标的设置
1.查看Oracle游标最大打开数
show parameter cursor; --查看所有和curcor有关的参数,自带like关键字
2.查看当前打开的游标
select * from v$open_cursor;
3.修改游标的最大打开数
alter system set open_cursors = 500 scope=both;--修改游标的最大打开数为500,
其中scope的取值为:
memory:仅修改内存,只会影响当前的使用,重启数据库就会失效。
spfile:仅修改配置文件,不会影响本次使用,重启数据库才生效。
both:两个都修改。