[数据库] 游标
游标(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;
本文来自博客园,作者:transformert,转载请注明原文链接:https://www.cnblogs.com/ac-network/articles/18797224

浙公网安备 33010602011771号