1、游标基础。
1)、一些有关数据提取的术语:
- 静态SQL:一个SQL语句在所在的块被编译的时候,就固定了,这样的SQL就是静态的SQL。(编译的时候就被构造出来)
- 动态SQL:一个SQL语句在被执行的时候才被构造出来的SQL语句就是动态SQL。(执行的时候被构造出来)
- 结果集:SQL语句所请求的行集的合。结果集在Oracle中都是被缓存在SGA区域中的。
- 隐式游标:当执行一个SQL DML语句(Insert、update、merge、Delete语句)或Select Into语句,PL/SQL都会声明一个隐式游标来指向对应的SQL语句执行结果,之所以是隐式的是因为数据库把游标的大部分操作都自动执行了,包括分配游标、打开游标、关闭游标等操作。
- 显式游标:明确的把一个SELECT语句声明成一个游标,还需要明确的执行游标的各种操作(打开、提取、关闭等)。当要使用静态SQL语句从数据源提取多行数据的时候,一般都会使用显式游标。
- 游标变量:一个指向或引用游标对象的变量。是变量就是可以改变的。
- 游标属性:就是在游标或游标变量后面加%attribute_name,利用游标的属性可以获取游标的属性,比如游标是否打开、已经从游标中提取了多少行等。
- SELECT FOR UPDATE:对查询出来的结果集加了行级锁,以保证这些数据不会先于我们处理前被其他人修改。
- 批量处理:PL/SQL 为查询语句提供了Bulk Collect语法,我们只用一步就可以取出一批数据。
2)、典型的查询操作:
PL/SQL为查询语句使用相同的操作方式:
- 解析:SQL语句处理的第一步就是分析,确保这个语句是有效的并生成执行计划。
- 绑定:用程序(宿主变量)中的值替换SQL语句中的占位符。静态SQL是PL/SQL引擎自己执行这个绑定操作,动态SQL是使用绑定变量。
- 打开:打开一个游标。
- 执行:语句被SQL引擎执行。
- 提取:通过游标把执行结果提取出来。
- 关闭:关闭游标,释放所有资源。
3)、游标属性介绍:
- %FOUND:是否成功取到记录,成功为True,否则False。
- %NotFound:如果没有成功取得记录返回true,否则False。
- %RowCount:返回当前已经从游标中取出的记录数量。
- %ISOpen:是否已经打开游标,是返回True,否则False。
- %Bulk_RowCount:返回ForAll语句修改的记录数量。
- %Bulk_Exceptions:返回ForAll语句修改记录出现的异常信息。
使用方式:显式游标:cursor_name%attribute_name,游标名称%属性名称;对于隐式游标名称就是固定的,就是“SQL”,如:SQL%FOUND。
2、使用隐式游标。
1)、 隐式游标是具有下面这些特性的SELECT语句:
- 这个Select语句出现在代码块的执行单元,而不是像显式游标那样在声明单元定义的。
- 查询带有Into语句,(批量的是Buik Collect Into 语句)。
- 我们不用打开、提取或关闭Select语句,所有操作都是由数据库完成的。
通用结果:select column_list [Bulk Collect] into varialbe list .
举个例子:
Declare
l_tile books.title%Type;
begin
Select title into l_title from books where ...
end
2)、隐式游标的异常处理:
隐式游标有两种异常:
- 如果查询没有一行,这时数据库会抛出NO_DATA_FOUND异常。
- 如果查询结果多余一行,数据会抛出TOO_MANY_ROWS异常。
3)、隐式游标的属性:
- SQL%FOUND 成功的取出一行,则返回true,否则False。
- SQL%NOFOUND 未能成功的取出一行,则返回true,否则false。
- SQL%ROWCOUNT 返回从游标中取出的记录数量,对于Select into语句,如果取出一条记录,这个值就是1,如果抛出NO_DATA_FOUND,这个值就是0.
- SQL%ISOPEN 对于隐式游标来说总是自动打开和关闭的,所以这个值永远是False。
注:在隐式游标使用属性的时候,SQL%FOUND等是取得的最后的一个隐式游标的属性,如果要取出中间某个隐式游标的属性值,要使用变量在隐式游标语句执行完成以后,立刻用变量接受游标的属性值。
浙公网安备 33010602011771号