oracle关于存储过程游标cursor和循环loop使用
1.cursor定义
cursor 参数 is sql语句
在前面定义:
cursor list is select * from table;
2.cursor使用
在begin……end中使用
begin
Open list;
Close list;
end;
注意:open cursor后一定要注意close cursor
3.对cursor游标数据每行使用(loop fetch使用)
定义:
cursor list is select * from table;
lis list%rowtype; --定义lis 取list一行数据操作
%rowtype表示该类型为“行数据类型”,存储的是一行数据,一行数据里可以有多列,类似于表里的一行数据,也可以是游标里的一行数据。
Begin
Open list;
Loop fetch list into lis;
……
Exit when list%notfound; --退出循环
End loop;
Close list;
End;
用fetch来读取游标每一行数据,
使用fetch注意一定要加退出循环条件:Exit when 退出条件;
否则会陷入无限循环,循环到最后一条后,fetch又会从第一条数据开始抓取。
cursor%NOTFOUND
表示这个游标没有查到数据
–%FOUND – SQL语句影响了一行或多行时为 TRUE
–%NOTFOUND – SQL语句没有影响任何行时为TRUE
–%ROWCOUNT – SQL语句影响的行数
注:cursor%notfound有三种状态,true,false,null。如果游标是空游标,%NOTFOUND将为null . EXIT WHEN 条件不会计算为TRUE(null计算结果为false),然后,循环将永远持续下去,所以以后为了安全期间可以加上是否为空的判断:EXIT WHEN cursor%NOTFOUND OR cursor%NOTFOUND IS NULL;
4.对cursor游标批量数据处理(fetch BULK COLLECT)
定义:
cursor list is select * from table;
TYPE type_lis IS TABLE OF list%ROWTYPE INDEX BY BINARY_INTEGER;
lis type_lis; --定义lis 是type_lis的数据
cn_batch_size constant pls_integer := 100;
说明:
– IS TABLE OF 指定是一个集合的表的数组类型,简单的来说就是一个可以存储一列多行的数据类型
– INDEX BY BINARY_INTEGER 指索引组织类型
– PLS_INTEGER是PLSQL环境中的一个特殊的数字类型,这种类型的值是通过硬件平台原生整数格式来表示的,PLS_INTEGER可以存储一个有符号的整形值,其精度范围和BINARY_INTEGER一样,是:-231~231
--接上面定义
Begin
Open list;
Loop
fetch list BULK COLLECT into lis limit cn_batch_size;
For i in 1.. lis.count loop
……
End loop;
Commit;
Exit when list.count < cn_batch_size ; --退出循环
End loop;
Close list;
End;
代码fetch list BULK COLLECT into lis limit cn_batch_size; 就是把list中的数据取cn_batch_size(这里为100条)数据赋给lis,再用for循环一条一条处理lis中的数据
更多推荐




所有评论(0)