oracle 游标--cursor
程序员文章站
2024-02-10 17:01:10
...
游标:临时存储从数据库中提取的数据块
为了执行速度,把数据从放在磁盘中的表中调到计算机内存中进行处理
declare --显式游标
emprow emp%rowtype;--定义保存游标检索结果行的记录变量
cursor emp_cur--定义游标 关联SQL语句
is
select * from emp where deptno is not null;
begin
open emp_cur; --打开游标 sql语句被执行 ,查询的数据保存到内存中,游标指向该内存区域
loop--循环检索游标
fetch emp_cur into emprow;--提取游标内容 提取游标中的数据到游标行中
dbms_output.put_line('bingo');
exit when emp_cur%notfound;--游标检索完退出循环
end loop;
close emp_cur; --关闭游标
end;
*--隐式游标 隐式游标自动关闭 所以%isopen属性总是false
oracle执行DML(insert、 update、 delete、 select into)语句时,会自动隐式地创建游标,自动打开、自动关闭、自动提交
通过关键字SQL来访问游标属性SQL%ROWCOUNT 、SQL%NOTFOUND
当系统使用隐式游标时,通过隐式游标的属性了解操作状态和结果、从而控制程序流程*
begin
update pandaa set name = '嘎嘎' where plan = 7369;--dml 更新语句
dbms_output.put_line(SQL%rowcount||'行被更新');--使用隐式游标属性判断已更新行数
if sql%notfound --隐式游标属性 判断是否没有任何更新
then dbms_output.put_line('更新失败');
end if;
commit;--自动向数据库提交
exception
when others--其他所有情况
then dbms_output.put_line(sqlerrm);--打印异常信息
end;
游标属性
1.%ISOPEN 游标变量是否打开 true、false
declare
cursor cur
is
select * from pandaa where plan = 1;
begin
if not cur%isopen then open cur;--如果游标没有打开则打开游标
end if;
if cur%isopen then dbms_output.put_line('游标已经被打开');
else dbms_output.put_line('游标还没打开');
end if;
close cur;
end;
*–%FOUND属性 fetch 语句获取数据前 、其值为null 即判断是否已经从游标取到数据
–%NOTFOUND属性 没有从游标中取到数据 返回true 与上面相反*
declare
emp_row pandaa%rowtype;
cursor cur
is
select *from pandaa where plan = 1;
begin
open cur;
if not cur%isopen then open cur; --如果游标没打开 则打开游标
end if;
if cur%notfound is null then dbms_output.put_line('%notfound 属性为null');--fetch获取游标数据之前 %notfound为null
end if;
loop
fetch cur into emp_row;
exit when cur%notfound; --游标指向没有数据了 跳出循环
end loop;
close cur;
end;
%rowcount 返回游标取出数据行数
declare
emp_row pandaa%rowtype;
cursor cur
is
select * from pandaa where plan = 1;
begin
open cur;
loop
fetch cur into emp_row;
exit when cur%notfound ;
dbms_output.put_line('当前已从游标提取的行数: '||cur%rowcount||'行');
end loop;
close cur;
end;
执行结果:
当前已从游标提取的行数: 1行
当前已从游标提取的行数: 2行
当前已从游标提取的行数: 3行
当前已从游标提取的行数: 4行
当前已从游标提取的行数: 5行
当前已从游标提取的行数: 6行
当前已从游标提取的行数: 7行
当前已从游标提取的行数: 8行
当前已从游标提取的行数: 9行
当前已从游标提取的行数: 10行
当前已从游标提取的行数: 11行
当前已从游标提取的行数: 12行
当前已从游标提取的行数: 13行
推荐阅读
-
oracle 游标--cursor
-
Oracle中的不等于号
-
【Oracle】
-
静态游标和动态游标
-
Oracle 11gR2 RAC添加新节点错误之--IP子网掩码
-
Oracle TTSORA-39322: Cannot use transportable tablespace wit
-
安装oracle 10 rac时遇到“Unable to access cluster service wh
-
从Oracle817导入到Oracle10.2.0.4过程中发生的错误及解决办法
-
SUSE Linux下的oraRun懒人包的门道(Oracle安装技巧)
-
Oracle 快照控制文件(snapshot control file)