--游标:实际上是把sql执行的结果保存在内存中,提供了访问执行结果的途径
--分类
--隐式游标:每个DML语句和PL/SQL语句都有
--显示游标:开发人员声明和控制
--举例一:单行提取tb_clazz表中的所有数据
declare
--1.定义游标,提取tb_clazz中的所有数据
cursor c_tb_clazz is
select * from tb_clazz;
r_tb_clazz tb_clazz%rowtype;
begin
--2.打开游标
open c_tb_clazz;
--3.提取数据:fetch 会抓到当前的行,并使指针向下移
fetch c_tb_clazz into r_tb_clazz;
dbms_out.put_line(r_tb_clazz.id);--测试结果
--4.关闭游标
close c_tb_clazz;
end;
--举例二:循环提取tb_clazz表中的所有数据
declare
--1.定义游标,提取tb_clazz中的所有数据
cursor c_tb_clazz is
select * from tb_clazz;
r_tb_clazz tb_clazz%rowtype;
begin
--2.打开游标
open c_tb_clazz;
--3.提取数据:fetch 会抓到当前的行,并使指针向下移
loop
fetch c_tb_clazz into r_tb_clazz;
exit when c_tb_clazz%notfound;--循环结束条件
dbms_out.put_line(r_tb_clazz.id);--测试结果
end loop;
--4.关闭游标
close c_tb_clazz;
end;
--带参数的游标
--举例三:提取每个班级信息,包括班级里面的学生信息
--该例需要两游标
declare
--1.定义游标,提取tb_clazz中的所有数据
cursor c_tb_clazz is--班级游标
select * from tb_clazz;
cursor c_tb_student(v_clazz_id number) is--学生游标
select * from tb_student where clazz_id=v_class_id;
r_tb_clazz tb_clazz%rowtype;
r_tb_student tb_student%rowtype;
begin
--2.打开游标
open c_tb_clazz;--使用班级游标
--3.提取数据:fetch 会抓到当前的行,并使指针向下移
loop
fetch c_tb_clazz into r_tb_clazz;
exit when c_tb_clazz%notfound;--循环结束条件
dbms_out.put_line(r_tb_clazz.id);--测试结果
--####内循环取学生信息####################
open c_tb_student(r_tb_clazz.id)--使用学生游标
loop
fetch c_tb_student into r_tb_clazz;
exit when c_tb_student%notfound;--循环结束条件
--测试学生信息
end loop;
close c_tb_student;
--########################################
end loop;
--4.关闭游标
close c_tb_clazz;
end;
--分类
--隐式游标:每个DML语句和PL/SQL语句都有
--显示游标:开发人员声明和控制
--举例一:单行提取tb_clazz表中的所有数据
declare
--1.定义游标,提取tb_clazz中的所有数据
cursor c_tb_clazz is
select * from tb_clazz;
r_tb_clazz tb_clazz%rowtype;
begin
--2.打开游标
open c_tb_clazz;
--3.提取数据:fetch 会抓到当前的行,并使指针向下移
fetch c_tb_clazz into r_tb_clazz;
dbms_out.put_line(r_tb_clazz.id);--测试结果
--4.关闭游标
close c_tb_clazz;
end;
--举例二:循环提取tb_clazz表中的所有数据
declare
--1.定义游标,提取tb_clazz中的所有数据
cursor c_tb_clazz is
select * from tb_clazz;
r_tb_clazz tb_clazz%rowtype;
begin
--2.打开游标
open c_tb_clazz;
--3.提取数据:fetch 会抓到当前的行,并使指针向下移
loop
fetch c_tb_clazz into r_tb_clazz;
exit when c_tb_clazz%notfound;--循环结束条件
dbms_out.put_line(r_tb_clazz.id);--测试结果
end loop;
--4.关闭游标
close c_tb_clazz;
end;
--带参数的游标
--举例三:提取每个班级信息,包括班级里面的学生信息
--该例需要两游标
declare
--1.定义游标,提取tb_clazz中的所有数据
cursor c_tb_clazz is--班级游标
select * from tb_clazz;
cursor c_tb_student(v_clazz_id number) is--学生游标
select * from tb_student where clazz_id=v_class_id;
r_tb_clazz tb_clazz%rowtype;
r_tb_student tb_student%rowtype;
begin
--2.打开游标
open c_tb_clazz;--使用班级游标
--3.提取数据:fetch 会抓到当前的行,并使指针向下移
loop
fetch c_tb_clazz into r_tb_clazz;
exit when c_tb_clazz%notfound;--循环结束条件
dbms_out.put_line(r_tb_clazz.id);--测试结果
--####内循环取学生信息####################
open c_tb_student(r_tb_clazz.id)--使用学生游标
loop
fetch c_tb_student into r_tb_clazz;
exit when c_tb_student%notfound;--循环结束条件
--测试学生信息
end loop;
close c_tb_student;
--########################################
end loop;
--4.关闭游标
close c_tb_clazz;
end;