数据库 游标
数据库 游标
主要就是对查询出来的数据结果做一些操作
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;
> 原文链接: https://www.cnblogs.com/ac-network/articles/18797224