pl/sql操作数据库之游标cursor的使用

这篇文章讲述的是pl/sql操作数据库之游标cursor的使用,如有错误或不当之处,还望各位大神批评指正。

什么是游标?

  • 在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现
  • 游标是一个指向上下文的句柄( handle)或指针。通过游标,PL/SQL可以控制上下文区和处理语句时上下文区会发生些什么事情。

如何处理游标?

游标的属性

  1. %FOUND 布尔型属性,当最近一次读记录时成功返回,则值为TRUE
  2. %NOTFOUND 布尔型属性,与%FOUND相反
  3. %ISOPEN 布尔型属性,当游标已打开时返回 TRUE
  4. %ROWCOUNT 数字型属性,返回已从游标中读取的记录数

显示的游标处理

  • 通常来说,游标的使用需要四个步骤:

    1. 定义游标:
      CURSOR cursor_name[(parameter[, parameter]…)] IS select_statement;
    2. 打开游标:
      OPEN cursor_name[([parameter =>] value[, [parameter =>] value]…)];
    3. 提取游标数据:
      FETCH cursor_name INTO {variable_list | record_variable };
    4. 关闭游标:
      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 ;

猜你喜欢

转载自blog.csdn.net/u013634252/article/details/80807622