oracle的学习历程 2017/8/31
来源:互联网 发布:大唐电信数据所 待遇 编辑:程序博客网 时间:2024/05/16 15:48
PL/SQL的游标(cursor)
游标是为了平衡两种状态。分别是sql查询的结果是集合的,一群数据。另一个是输入的变量是单次的,就是一个变量只能存放一条记录,而且事先也不知道要放多少变量,所以就用游标来平衡变量和结果的状态。
可以让开发者一次访问一个或多个结果集,然后将结果集中的内容逐条访问并显示。
工作原理是当pl/sql块执行select,insert,update,delete的时候,oracle会为他们在内存中分配一个缓冲区,那么游标就是指向该区的一个指针,从而对多行数据查询结果中的每一行数据进行分别处理。
游标分为显式游标和隐式游标。显式游标是用户声明和操作的一种游标。隐式的是oracle在数据操纵语言中自动声明和操作的游标。在每次操作数据库的时候,可以同时打开多个游标,数量是由数据库初始化参数文件open cursors定义。
显式游标处理步骤:声明游标,打开游标,提取游标,关闭游标。
游标的声明定义了游标的名字和一个select语句相关联。语法:cursor 游标名 is select 语句
例如:cursor teacher is select tid,tname,title,sex
from teachers
where tid<7;
需要注意的是,定义游标中的select语句中不包含into子句,因为into子句是在提取游标部分。
打开游标
语法:open 游标名
打开游标其实就是执行select语句,执行完了以后,查询结果进入内存,游标停在查询结果的首部,但不是第一行。
打开已经被打开的游标是可以的,系统会默认的重新打开重复游标前执行一次close语句
这里需要每次执行才可以,除非放到循环里才可以自动重复执行。
提取游标
语法:fetch游标名into变量列表
就比如
declare
teacher_id number(5);
teacher_name varchar2(50);
teacher_tile varchar2(50);
teacher_sex char(1);
cursor teacher_cur is select tid,tname,title,sex
from teachers
where tid<7;
begin
open teacher_cur;
fetch teacher_cur into teacher_id,teacher_name,teacher_title,teacher_sex; 将第一行数据放到变量里,游标下移。
执行FETCH语句时,每次返回一个数据行,然后自动将游标移动指向下一个数据行。当检索到最后一行数据时,如果再次执行FETCH语句,将操作失败,并将游标属性%NOTFOUND置为TRUE。所以每次执行完FETCH语句后,检查游标属性%NOTFOUND就可以判断FETCH语句是否执行成功并返回一个数据行,以便确定是否给对应的变量赋了值。
关闭游标
当所有的活动集都被检索以后,游标就应该关闭,并释放资源。这些资源包括活动集的存储空间也包括存储活动集的临时空间。
close 游标名
如果在关闭了游标以后还去提取游标数据。系统会产生ORA-1001:Invalid cursor错误(非法游标)或者ORA-1002:FETCH out OF sequence 超出界限
一个完整实例,如何将同一张表的内容分别放到男老师表里和女老师表里。
使用显式游标的注意事项:
1、首先使用前要用%ISOPEN检查是否为打开状态。此值为true的时候游标才可以使用,否则要先将游标打开
2、使用的时候,每次都要用%found或者%notfound来检查是否有返回值。这个一般放到循环里,自动检查
3、自动添加到变量里的时候,变量个数和数据类型必须完全一致。
4、用完游标必须将其关闭,并且释放资源。
隐式游标实例,这里只需要注意一点,每一个隐式游标都必须有一个into子句。
游标属性
无论隐式还是显式游标,都有%isopen,%found,%notfound,%rowcount四种属性
%isopen 查看游标是否处于打开状态。
%found 说明当前游标是否指向有效一行,若是则为true
%notfound 与found效果相同,值正好相反
%rowcount 记录了游标所在的行号,在操作中用于中断循环。只抽取多少条数据。比如
当然,游标也可以带上参数使用
游标变量,与平常的变量不一样的地方是,游标变量可以在运行时与不同的语句关联,是动态的。游标变量用于处理多行的查询结果集。在同一个pl/sql块中,游标变量不同于特定的查询。而是打开游标时才对应查询,所以说变量是动态的。
声明变量:语法:type 类型名 is ref cursor
return 返回类型
type 是已经被定义的类型,REF是指明新的类型必须是一个指向被定义的指针。所以,游标可以使用的类型是ref cursor
可以被用户详细列表写出定义的内容(显式)也可以用%rowtype方式复制其他的变量(隐式)。
详细例子:
定义游标变量方式2:他在声明的时候没有return。比如:
declare
type t_FlexibleRef is REF CURSOR;
V_CURSORVar t_FlexibleRef;
这种没有return的代表没有返回类型,也就是可以在任何游标里面打开使用。
打开游标变量:
open 游标变量 for <select语句>
这里的话游标变量的类型必须和select语句中的类型一样,否则会报错ORA_6504
例子:
declare
type t_SdudentsRef is ref CURSOR
RETURN students%ROWTYPE;
V_StudentSCV t_SdudentsRef;
begin
open V_StudentSCV for
select * from students;
end;
关闭游标变量,与关闭游标一样。但是不能关闭已关闭的游标变量。
- oracle的学习历程 2017/8/31
- oracle的学习历程 2017/8/30
- oracle的学习历程 2017/9/1
- oracle的学习历程 2017/9/2
- oracle学习历程 2017/8/20
- oracle学习历程 2017/8/21
- oracle学习历程 2017/8/22
- oracle学习历程 2017/8/29
- oracle的安装历程...
- Ogre 学习的历程
- 我的学习历程
- spring的学习历程
- PHP的学习历程
- EXCELVBA的学习历程
- WPF学习的历程
- 学习Java的历程
- PHP学习的历程
- orale的学习历程
- D002_Java类和对象
- POJ3169差分约束(SPFA+差分约束)
- Ugly Numbers, UVa 136
- 5只国家队基金上半年赚百亿,蓝筹股成重仓首选
- 精通 CSS 选择器
- oracle的学习历程 2017/8/31
- POJ 2533 Longest Ordered Subsequence(LIS)
- 项目的生命周期
- 4.3.1深度定时器(Timer in Depth)
- python/caffe/_caffe.cpp:47:31: fatal error: numpy/arrayobject.h: 没有那个文件或目录
- 尺取法入门--poj 3061
- 13.background背景图
- STM32通过中断方式实现USART1通信
- 字节流