--显式游标
declare
cursor c_c is select * from scott.emp;--定义游标
r_r scott.emp%rowtype; --定义变量[rowtype为行类型]
begin
open c_c; --打开游标
loop --简单循环
fetch c_c into r_r; --将数据放入变量[执行FETCH语句时,每次返回一个数据行,然后自动将游标移动指向下一个数据行。]
dbms_output.put_line(r_r.job); --输出行变量中字段数据
exit when c_c%notfound; --如果没有下一条数据[退出条件 found有下条数据 notfound没有下条数据]
end loop;
close c_c; --关闭游标
end;
--带有参数的游标
declare
cursor c_c(mid number default 7521) is select * from scott.emp where empno=mid;--定义游标
r_r scott.emp%rowtype; --定义变量[rowtype为行类型]
begin
open c_c(7788); --打开游标
loop --简单循环
fetch c_c into r_r;
dbms_output.put_line(r_r.job||' '||r_r.empno); --输出行变量中字段数据
exit when c_c%notfound; --如果没有下一条数据[退出条件 found有下条数据 notfound没有下条数据]
end loop;
close c_c; --关闭游标
end;
--隐式游标
declare
cursor c_c is
select * from scott.emp;
r_r scott.emp %rowtype;
begin
for v_r in c_c loop --自动打开游标,自动检测NOTFOUND
dbms_output.put_line(v_r.job);
end loop;
--隐含关闭游标
end;
--游标变量
declare
type m_c_type is ref cursor; --定义游标类型 m_c_type
c_c m_c_type; --声明游标变量
r_r scott.emp%rowtype;
begin
open c_c for --打开游标变量
select * from scott.emp;
loop
fetch c_c
into r_r;
dbms_output.put_line(r_r.job);
exit when c_c%notfound;
end loop;
end;
--动态定义游标
declare
msql varchar2(111) := 'select * from emp';
tbl_emp emp%rowtype;
type cur_type is ref CURSOR;
cur cur_type;
begin
OPEN cur for msql; --打开动态定义的游标
LOOP
FETCH cur
into tbl_emp; --循环赋值
EXIT WHEN cur%NOTFOUND; --跳出条件
dbms_output.put_line(tbl_emp.empno || ' ' || tbl_emp.ename); --打印
END LOOP;
end;