PL/SQL之显示游标使用
2016-02-27 23:44
274 查看
1.认识游标
ORACLE在执行增删改查时,ORACLE会在内存中分配缓冲区。游标是指向该区的一个指针,通过指针找到每一行的数据。
注:PL/SQL程序中,处理多行数据时通常选用游标来处理;
不同SQL使用游标的情况如下:
非查询语句,游标是隐式的;
结果是单行的查询语句,游标可以是显式的,也可以是隐式的;
结果是多行的查询语句,游标是显式的;
2.显式游标
显式游标的处理需要四个步骤:
(1)定义/声明游标,定义游标名和相应的SELECT语句
语法格式:
打开游标的作用就是执行SELECT语句,将数据放入缓冲区,同时指针指向缓存区数据集合顶部;
语法格式:
(3)提取游标
检索结果集合中的数据行,将其放入对应的输出变量中
语法格式:
%NOTFOUND设置成true,所以每次检索时都需要去判断%NOTFOUND的状态,以便确定循环抓取的情况,
做出正确的处理。
(4)关闭游标
当提取和处理游完游标结果集,需及时关闭游标,释放占用的系统资源,同时使得游标的工作区无效,FETCH将不能
再抓到数据。当我们想再用时,通过OPEN命令打开。
CLOSE cursor_name;
显示游标使用实例:
第一步,创建表,插入数据:
ORACLE在执行增删改查时,ORACLE会在内存中分配缓冲区。游标是指向该区的一个指针,通过指针找到每一行的数据。
注:PL/SQL程序中,处理多行数据时通常选用游标来处理;
不同SQL使用游标的情况如下:
非查询语句,游标是隐式的;
结果是单行的查询语句,游标可以是显式的,也可以是隐式的;
结果是多行的查询语句,游标是显式的;
2.显式游标
显式游标的处理需要四个步骤:
(1)定义/声明游标,定义游标名和相应的SELECT语句
语法格式:
CURSOR cursor_name[(param1,param2..)]--参数,可以选择 [RETURN dataType]--返回值 IS SELECT语句。 --参数格式 param_name [IN] dataType [:= DEFAULT expression] --注意:dataType类型不能跟长度,如NUMBER(4)等都会报错。(2)打开游标
打开游标的作用就是执行SELECT语句,将数据放入缓冲区,同时指针指向缓存区数据集合顶部;
语法格式:
OPEN cursor_name [(param1 value1,param2 value2....)]; --如果定义时有参数,需传入对应的参数值
(3)提取游标
检索结果集合中的数据行,将其放入对应的输出变量中
语法格式:
FETCH cursor_name INTO {variable_list|record_variable };FETCH执行一次,就会返回一条记录,指针指向下一行,如果抓不到数据时,将会操作失败,同时将游标属性
%NOTFOUND设置成true,所以每次检索时都需要去判断%NOTFOUND的状态,以便确定循环抓取的情况,
做出正确的处理。
(4)关闭游标
当提取和处理游完游标结果集,需及时关闭游标,释放占用的系统资源,同时使得游标的工作区无效,FETCH将不能
再抓到数据。当我们想再用时,通过OPEN命令打开。
CLOSE cursor_name;
显示游标使用实例:
第一步,创建表,插入数据:
<span style="color:#000000;">create table mytest( id number(3), name varchar2(20), age number(3) ); insert into mytest values(1,'one',18); insert into mytest values(2,'two',20); insert into mytest values(3,'three',24); commit; </span>第二步,实例
DECLARE --1.定义游标 CURSOR cursor_test IS SELECT NAME,age FROM mytest; v_name mytest.name%TYPE; v_age mytest.age%TYPE; BEGIN --2.打开游标 OPEN cursor_test; --3.fetch抓取 /*A部分从游标顶部抓取第一行数据,游标指向下一行数据, B部分WHILE循环,先看布尔表达式是否满足,满足有值,接着忘下循环。 循环中每循环一次,从第二行开始抓数据,知道数据集合处理完毕。*/ FETCH cursor_test INTO v_name,v_age;--A WHILE cursor_test%FOUND LOOP--B DBMS_OUTPUT.PUT_LINE(v_name||' '||to_char(v_age)); FETCH cursor_test INTO v_name,v_age; END LOOP; --4.关闭游标 CLOSE cursor_test; END;
相关文章推荐
- mysql开启缓存
- SQLServer 表值函数与标量值函数 定义方式与调用区别
- 设置mysql的最大连接数
- 安卓第四天笔记-Sqlite
- oracle体系结构 LGWR DBWR
- MySQL数据库集群的原理与搭建
- 查看ORACLE的实际执行计划
- mysql ERROR 1045 (28000) 解决方法
- python使用memcached
- sql中的三种表联结类型
- MySQL知识(十八)——MySQL触发器
- 解决wamp或者MySQL密码忘记
- mysql(mariadb)语句
- MySQL-Front 建表引发的一点小思考(数据表格模版)
- PLSQL如何调试存储过程
- oracle merge into 语法
- Redis安装部署
- C# 如何确定SQL Server 中数据表是否存在
- 数据库锁的基本原理
- 机房重构 之 抽象工厂+反射+配置文件 实现数据库訪问