这篇文章讲述的是pl/sql操作数据库之游标cursor的使用,如有错误或不当之处,还望各位大神批评指正。
什么是游标?
- 在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现
- 游标是一个指向上下文的句柄( handle)或指针。通过游标,PL/SQL可以控制上下文区和处理语句时上下文区会发生些什么事情。
如何处理游标?
游标的属性
- %FOUND 布尔型属性,当最近一次读记录时成功返回,则值为TRUE
- %NOTFOUND 布尔型属性,与%FOUND相反
- %ISOPEN 布尔型属性,当游标已打开时返回 TRUE
- %ROWCOUNT 数字型属性,返回已从游标中读取的记录数
显示的游标处理
通常来说,游标的使用需要四个步骤:
- 定义游标:
CURSOR cursor_name[(parameter[, parameter]…)] IS select_statement;
- 打开游标:
OPEN cursor_name[([parameter =>] value[, [parameter =>] value]…)];
- 提取游标数据:
FETCH cursor_name INTO {variable_list | record_variable };
- 关闭游标:
CLOSE cursor_name;
- 定义游标:
例:假设有student表,查询所有学生的姓名(while)
--假设有student表,查询所有学生的id和姓名
declare
v_name student.name%Type ;
v_id student.id%Type ;
--定义游标
cursor std_name_cursor is select id,name from student ;
begin
--打开游标
open std_name_cursor ;
--提取游标数据
fetch std_name_cursor into v_id,v_name ;
while std_name_cursor%found loop
dbms_output.put_line(v_id||'的名字是'||v_name) ;
fetch std_name_cursor into v_id,v_name ;
end loop ;
--关闭游标
close std_name_cursor ;
end ;
游标的for循环
PL/SQL语言提供了游标FOR循环语句,自动执行游标的OPEN、FETCH、CLOSE语句和循环语句的功能;当进入循环时,游标FOR循环语句自动打开游标,并提取第一行游标数据,当程序处理完当前所提取的数据而进入下一次循环时,游标FOR循环语句自动提取下一行数据供程序处理,当提取完结果集合中的所有数据行后结束循环,并自动关闭游标。
例:假设有student表,查询所有学生的姓名(for)
--假设有student表,查询所有学生的姓名
declare
--定义游标
cursor std_name_cursor is select id,name from student ;
begin
--for循环会自动地打开游标,查询游标,关闭游标
for std in std_name_cursor loop
dbms_output.put_line(std.id||'的名字是'||std.name);
end loop ;
end ;
带参的游标
- 游标在定义时可以带上参数
- 例:查询所有男同学的姓名(使用带参游标)
--假设有student表,查询所有学生的姓名
declare
--定义游标
cursor std_name_cursor(c_sex student.sex%Type default 'M')
is select id,name from student where sex = c_sex ;
begin
--for循环会自动地打开游标,查询游标,关闭游标
for std in std_name_cursor loop
dbms_output.put_line(std.id||'的名字是'||std.name);
end loop ;
end ;
--或者
--假设有student表,查询所有学生的姓名
declare
--定义游标
cursor std_name_cursor(c_sex student.sex%Type)
is select id,name from student where sex = c_sex ;
begin
--for循环会自动地打开游标,查询游标,关闭游标
for std in std_name_cursor('M') loop
dbms_output.put_line(std.id||'的名字是'||std.name);
end loop ;
end ;
隐式的游标处理
什么是隐式游标
- 显式游标主要是用于对查询语句的处理,尤其是在查询结果为多条记录的情况下;而对于非查询语句,如修改、删除操作,则由ORACLE 系统自动地为这些操作设置游标并创建其工作区,这些由系统隐含创建的游标称为隐式游标
- 隐式游标的名字为SQL,这是由ORACLE 系统定义的
- 对于隐式游标的操作,如定义、打开、取值及关闭操作,都由ORACLE 系统自动地完成,无需用户进行处理
格式调用为:
SQL%
例:更新i学生,年龄+1,若没有找到该学生,则输出‘查无此人’
--假设有表student,将学生年龄+1
begin
--在进行增删改操作时,无需人工定义游标,oracle会自动生成游标
--如需调用,则使用sql%
update student
set age = age+1
where id = 100002 ;
if sql%notfound then dbms_output.put_line('查无此人');
end if ;
end ;