六、游标
一、定义游标
declare
Cursor cursor_name is select ename from emp; --声明游标指定一个集给它
v_name emp.ename%type;
begin
open cursor_name; --打开游标
fetch cursor_name into v_name; --每次into取游标中的一行
dbms_output.put_line(v_name);
close cursor_name; --关闭游标
end;
二、显示游标属性
1、%isopen: --打开游标
实例:
declare
Cursor cursor_name is select ename from emp;
begin
if c1%isopen then
dbms_output.put_line('游标已经打开了');
else
open c1;
end if;
end;
2、%found --检查是否从结果集中提取了数据
3、notfound --没有从结果集中提取数据
4、%ROWCOUNT --返回当前行为已经提取到的实际行数
declare
Cursor cursor_name is select ename from emp; --select_statement用于指定游标所对应的select语句
v_name emp.ename%type;
begin
open cursor_name;
loop --打开游标
fetch cursor_name into v_name;--into每次只能取一个值
exit when cursor_name%notfound;
dbms_output.put_line(v_name);--每次循环输出一次名字
dbms_output.put_line(cursor_name%rowcount);--每次循环输出一次行数
end loop;
close cursor_name; --关闭游标
end;
游标属性使用:游标名%属性,一般用于判断条件和终止循环;
三、游标的应用
1、用游标指向的集合做数据类型
declare
cursor emp_cursor(no number) is select ename,sal from emp empno=no; --带一个参数不能定义大小
emp_record emp_cursor%rowtype; --游标集合类型的变量
begin
open emp_cursor(7934);--打开游标时给参数赋值
loop
fetch emp_cursor into emp_record;
exit when emp_cursor%notfound;
dbms_output.put_line('雇员名:'||emp_record.ename||'雇员工资:'||emp_record.sal);
end loop;
close emp_cursor;
end;
2、--使用游标for循环
declare
cursor emp_cursor is select ename,sal from emp;
begin
for emp_record in emp_cursor loop--emp_cursor有多数据就执行多少次 没次指针移动一次 将值给emp_record
dbms_output.put_line('第'||emp_cursor%rowcount||'个雇员'||emp_record.ename);
end loop;
end;
3、--使用游标for中直接使用子查询
begin
for emp_record in(select ename,sal from emp) loop--子查询有多少行数据就执行多少次
dbms_output.put_line(emp_record.ename);
dbms_output.put_line(emp_record.sal);
end loop;
end;
四、游标变量
1、--输出empno>7900的名字和工资
declare
type myrec is record(
name emp.ename%type,
sal emp.sal%type
);
type mycur is ref cursor;--声明一个游标类型
rec myrec;
c1 mycur;--游标类型的游标变量
begin
open c1 for select ename,sal from emp where empno>7900; --打开游标时选择指向的集合 从而更加方便使用
loop
fetch c1 into rec;
exit when c1%notfound;
dbms_output.put_line(rec.name||rec.sal);
end loop;
close c1;
end;
2、--设置游标提取的返回类型
declare
type myrec is record(
sal number
);
type mycur is ref cursor return myrec; --必须是type类型的返回值 不能定义char等类型
rec myrec;
c1 mycur;
begin
open c1 for select sal from emp where empno>7000; --因为定义的返回值只有一列数据所以只能返回一列数据 类型是number
loop
fetch c1 into rec;
exit when c1%notfound;
dbms_output.put_line(rec.sal);
end loop;
close c1;
end;