二. 游标类型: 隐式游标,显示游标,REF游标。其中,隐式游标和显示游标属于静态游标(运行前将游标与SQL语句关联),REF游标属于动态游标(运行时将游标与SQL语句关联)。
三. 隐式游标: DML语句对应的游标,由Oracle自动管理,也称SQL游标。
隐式游标的属性有:
a.%FOUND – SQL 语句影响了一行或多行时为 TRUE
b.%NOTFOUND – SQL 语句没有影响任何行时为TRUE
c.%ROWCOUNT – SQL 语句影响的行数
d.%ISOPEN - 游标是否打开,始终为FALSE
举例说明:
declare
v_empno emp.empno%type:=7000;
begin
update empset ename='fxe'where empno=v_empno;
ifSQl%found then
dbms_output.put_line(SQL%rowcount||'Delete Ok!');
endif;
ifSQL%notfoundthen
dbms_output.put_line('雇员编号'||v_empno||'不存在');
endif;
end;
四. 显示游标操作:
(1)声明游标(关联SQL语句) cursor+游标名 is/as sql语句
(2)打开游标(执行SQL语句,填充游标) open+游标名
(3)提取游标的行 fetch 游标名 into行类型变量
(4)关闭游标 close+游标名
举例说明:
declare
cursor emp_cur is select * from emp;
empRecord emp%rowtype;
begin
open emp_cur;
loop
fetch emp_cur into empRecord;
exit when emp_cur%notfound;
dbms_output.put_line(empRecord.ename);
end loop;
close emp_cur;
end;
五.使用显示游标更新行
1.允许使用游标删除或更新活动集中的行
2.声明游标时必须使用 SELECT … FOR UPDATE语句
declare
old_sal number(4);
emp_name varchar2(20);
cursor emp_cur is select ename,sal from emp
where sal<1000
for update of sal;
begin
open emp_cur;
loop
fetch emp_cur into emp_name,old_sal;
exit when emp_cur%notfound;
update emp set sal=1.1*old_sal
where current of emp_cur;
dbms_output.put_line('更新成功!');
end loop;
end;
六.REF游标和游标变量
1.REF游标和游标变量用于处理运行时动态执行的 SQL查询
2.创建游标变量需要两个步骤:
声明 REF游标类型
声明 REF游标类型的变量
3.用于声明 REF游标类型的语法为:
TYPE <ref_cursor_name> IS REF CURSOR
[RETURN <return_type>];
打开游标变量的语法如下:
OPEN cursor_name FOR select_statement;
声明强类型的REF游标
type emp_cur is ref cursor return emp%rowtype;
empRecord emp_cur;
声明弱类型的REF游标
type emp_cur is ref cursor;
empRecord emp_cur;
例:
DECLARE
TYPE emp_cur IS REF CURSOR
RETURN emp%ROWTYPE;
empObj emp_cur;
empRecord emp%ROWTYPE;
BEGIN
OPEN empObj FOR
SELECT * FROM emp;
loop
FETCH empObj INTO empRecord;
exit when empObj%notfound;
dbms_output.put_line(empRecord.ename);
end loop;
CLOSE empObj;
END;
七.游标变量的优点和限制
优点:
1.游标变量的功能强大,可以简化数据处理。
2.游标变量的优点有:
3.可从不同的 SELECT语句中提取结果集
4.可以作为过程的参数进行传递
5.可以进行赋值运算
限制:
1.不能在程序包中声明游标变量
2.FOR UPDATE子句不能与游标变量一起使用
3.不能使用比较运算符