[数据库] 游标

游标(cursor)

主要就是对查询出来的数据结果做一些操作

1.会节省网络资源
2.增大了内存消耗

--游标(Cursor) *****   多条数据的结果集 【集合】

--1、定义游标  cursor 游标名 is select语句
--2、打开游标 open 游标名
--3、提取数据 fetch 游标名 into 变量名
--4、关闭游标 close 游标

-- 定义一个游标 emp_cursor  显示游标中的前两行数据
declare
  cursor emp_cursor is select * from s_emp;
  var_emp s_emp%rowtype;
begin
  open emp_cursor;
  fetch emp_cursor into var_emp;  --每fetch一次 指针偏移量+1 获取一行数据
  dbms_output.put_line(var_emp.id||':'||var_emp.first_name||':'||var_emp.salary);
  fetch emp_cursor into var_emp;  --每fetch一次 指针偏移量+1 获取一行数据
  dbms_output.put_line(var_emp.id||':'||var_emp.first_name||':'||var_emp.salary);
  close emp_cursor;
end;
/
--练习 查询s_dept表中的所有数据, 定义一个游标dept_cursor放到var_dept变量中,提取前四行中的数据;
declare
  --任何合法的select语句都可以看成是一张内存表
  cursor dept_cursor is select * from s_dept;
  var_dept dept_cursor%rowtype;
begin
  open dept_cursor;
  fetch dept_cursor into var_dept;
  dbms_output.put_line(var_dept.id||':'||var_dept.name||':'||var_dept.region_id);
  fetch dept_cursor into var_dept;
  dbms_output.put_line(var_dept.id||':'||var_dept.name||':'||var_dept.region_id);
  fetch dept_cursor into var_dept;
  dbms_output.put_line(var_dept.id||':'||var_dept.name||':'||var_dept.region_id);
  fetch dept_cursor into var_dept;
  dbms_output.put_line(var_dept.id||':'||var_dept.name||':'||var_dept.region_id);
  close dept_cursor;
end;
/

--游标的遍历
/*
属性:
  游标名%found  当提取到新数据时,返回 true ,当提取不到新数据时返回false
  游标名%notfound 当提取不到新数据时,返回true,当提取到新数据时返回false
  两个前提:
  1、游标必须处于打开状态
  2、必须提取到新数据
*/
--遍历emp_cursor游标中的所有数据 使用简单循环+游标名%notfound属性
declare
  cursor emp_cursor is select * from s_emp;
  var_emp emp_cursor%rowtype;
begin
  open emp_cursor;
  loop
  fetch emp_cursor into var_emp;
  exit when emp_cursor%notfound;
  dbms_output.put_line(var_emp.id||':'||var_emp.first_name||':'||var_emp.salary);
  end loop;
  close emp_cursor;
end;
/
--使用简单循环+游标名%notfound 遍历 dept_cursor游标中的所有数据。
declare
  --任何合法的select语句都可以看成是一张内存表
  cursor dept_cursor is select * from s_dept;
  var_dept dept_cursor%rowtype;
begin
  open dept_cursor;
  loop
  fetch dept_cursor into var_dept;
  exit when dept_cursor%notfound;
  dbms_output.put_line(var_dept.id||':'||var_dept.name||':'||var_dept.region_id);
  end loop;
  close dept_cursor;
end;
/
--使用while循环+游标名%found 遍历emp_cursor游标中的所有数据
set serveroutput on;
declare
  cursor emp_cursor is select * from s_emp;
  var_emp emp_cursor%rowtype;
begin
  open emp_cursor;
  fetch emp_cursor into var_emp;
  while emp_cursor%found loop
    dbms_output.put_line(var_emp.id||':'||var_emp.first_name||':'||var_emp.salary);
    fetch emp_cursor into var_emp;
  end loop;
  close emp_cursor;
end;
/

--使用for循环完成 dept_cursor 游标中所有数据的遍历
--智能循环 自动定义变量 自动的打开游标 自动的提取数据 自动的关闭游标
set serveroutput on;
declare
  --任何合法的select语句都可以看成是一张内存表
  cursor dept_cursor is select * from s_dept;
begin
  for var_dept in dept_cursor loop
    dbms_output.put_line(var_dept.id||':'||var_dept.name||':'||var_dept.region_id);
  end loop;
end;
/
/*
游标中的其他属性(了解)
游标名%isopen 判断游标是否打开  true false
游标名%rowcount  记录游标指针偏移量, 统计提取数据的次数
*/

--异常(了解)
/*
  编译时异常(了解)
  运行时异常[500【90% 空指针异常NullPointerException】 404 ]
*/
set serveroutput on;
declare
  var_name s_emp.first_name%type;
begin
  --同一个程序可能出现异常,也可能不出现异常
  select first_name into var_name from s_emp;
  dbms_output.put_line(var_name);
exception
  --处理异常,相当于java中catch ,专门用来捕获异常
  --对于已知异常的处理
  when NO_DATA_FOUND then
  dbms_output.put_line('未查找到相关数据');
  --对于未知异常如何处理?
  when others then
  dbms_output.put_line('哈哈哈,出异常了,真开心');
end;
/


select first_name into var_name from s_emp;
posted @ 2025-03-28 08:32  transformert  阅读(11)  评论(0)    收藏  举报