ORACLE PL/SQL基础 游标
来源:互联网 发布:centos7 ubuntu 对比 编辑:程序博客网 时间:2024/05/17 05:11
ORACLE的游标分为显式游戏、隐式游戏,
显式游标是指用户自己定义、操作的,用于处理查询返回多行的SELECT查询结果;
隐式游标是系统自动进行操作、用于处理DML语句和返回单行数据的SELECT查询。
在本文,主要讨论显式游标。
一、游标的使用步骤
步骤分四步:定义游标、打开游标、检索游标、关闭游标。
1、定义游标
游标必须在PL/SQL块的声明部分定义。
CURSOR cursor_name IS select_statement ;定义游标时,并没有生成seletct_statement(SELECT查询)的数据,当打开游标后,才真正生成数据。
2、打开游标
OPEN cursor_name ;只有打开游标后,才会从数据库中查询出数据,缓存到内存分配的缓冲区里。
3、检索游标
FETCH curso_name INTO variable_list ;
检索游标的前提是,必须打开了游标,只有打开了游标了,缓冲区才会有数据。
游标检索数据,只能下移,不能回退,如:检索了第二条数据又想检索第一条数据,则必须先关闭游标后,再打开游标,才能检索第一条数据。
4、关闭游标
处理完游标检索出来的数据后,必须关闭游标,才能释放它所占用的系统资源,如所占用的内在缓冲区。
CLOSE curso_name ;
二、游标使用例子
declare -- declare cursor cursor c_dept is select * from dept t order by t.deptno; v_dept c_dept%rowtype;begin --open cursor c_dept open c_dept; --检索cursor c_dept loop fetch c_dept into v_dept; exit when c_dept%notfound; dbms_output.put_line ('deptno:'||v_dept.deptno||',dname:'||v_dept.dname||',loc:'||v_dept.loc); end loop; --close cursor close c_dept;end;
三、游标的属性
显式、隐式游标都四个属性:%ISOPEN、%FOUND、%NOTFOUND和%ROWCOUNT。
1、%ISOPEN,布尔型,检查游标是否已经打开,已经打开则返回TRUE,否则返回FALSE;
2、%FOUND,布尔型,判断最近一次使用FETCH..INTO 语句是否从缓冲区检索到数据,有数据则返回TRUE,否则返回FALSE;
3、%NOTFOUND,布尔型,返回值跟%FOUND相反;
4、%ROWCOUNT,数值型,返回到目前为止从游标缓冲区检索到的记录个数。
四、游标的检索
游标对应的缓冲区可能有多行记录,而PL/SQL中每次只能处理一行记录,因此需要采取循环的方式从缓冲区中取出数据进行处理,根据循环方法的不同,有3种检索游标方式。
1、 简单循环检索游标
OPEN cursor_name ;LOOPFETCH … INTO …EXIT WHEN cursor_name%NOTFOUND ;END LOOP ;CLOSE cursor_name ;
2、 WHILE循环检索游标
OPEN cursor_name ;FETCH … INTO …WHILE cursor_name%FOUND LOOP FETCH … INTO … …END LOOP ;CLOSE cursor_name ;
3、 FOR循环检索游标
使用FOR循环检索游标时,系统会自动打开、检索和关闭游标,用户只需要考虑如何处理检索出来的数据。
FOR loop_variable IN cursor_name LOOP…END LOOP ;
使用FOR循环检索游标时,系统会隐含定义一个数据类型cursor_name%ROWTYPE的循环变更loop_variable,同时进行%FOUND属性检查,当缓冲区中的数据都检索完或循环中断时,系统自动关闭游标。
如:Declare -- declare section here cursor c_dept is select * from dept t order by t.deptno ;begin for v_dept in c_dept loop dbms_output.put_line('deptno:'||v_dept.deptno||',dname:'||v_dept.dname||',loc:'||v_dept.loc); end loop ;end;
这个例子也可以改成:
declare -- declare section here --cursor c_dept is --select * from dept t order by t.deptno ;begin for v_dept in (select * from dept t order by t.deptno) loop dbms_output.put_line('deptno:'||v_dept.deptno||',dname:'||v_dept.dname||',loc:'||v_dept.loc); end loop ;end;
...
- ORACLE PL/SQL基础 游标
- Oracle PL/SQL基础--游标的学习
- Oracle PL/SQL基础--游标的学习
- Oracle PL/SQL游标
- oracle pl sql 游标
- oracle pl/sql 游标
- Oracle pl/sql 游标
- ORACLE PL/SQL 基础2 (游标的学习)
- oracle pl sql fetch游标
- oracle pl sql 参数游标
- oracle pl sql 更新游标
- Oracle PL/SQL cursor(游标)
- Oracle(PL/SQL编程基础(PL/SQL程序块与PL/SQL语句)、异常、游标、数据类型)
- Oracle(PL/SQL编程基础(PL/SQL程序块与PL/SQL语句)、异常、游标、数据类型)
- Oracle PL/SQL显示游标、隐式游标、游标循环
- oracle pl sql 隐式游标SQL
- ORACLE PL/SQL 基础
- ORACLE PL/SQL 基础
- Unity游戏开发--30s制作精美地图
- java中使用反射获取pojo(实体)类的所有字段值
- mybatis和ibatis区别
- boa
- redhat 5.9做RAC前的双网卡绑定
- ORACLE PL/SQL基础 游标
- android模拟器运行APP异常
- 2014百度软开笔试题
- jQuery右侧弹出全屏覆盖菜单
- Exercise 41:学会阐述面向对象
- 在cocos2d里面如何使用Texture Packer和像素格式来优化spritesheet
- 最常用的详细正则表达式大全
- JSP(7):网站计数器(1)
- Hadoop-2.4.0中HDFS文件块大小默认为128M