游标: 容器,存储SQL语句影响行数。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
2. 游标类型: 隐式游标,显示游标,REF游标。其中,隐式游标和显示游标属于静态游标(运行前将游标与SQL语句关联),REF游标属于动态游标(运行时将游标与SQL语句关联)。
3. 隐式游标: DML语句对应的游标,由Oracle自动管理,也称SQL游标。
q 隐式游标的属性有:
q %FOUND – SQL 语句影响了一行或多行时为 TRUE
q %NOTFOUND – SQL 语句没有影响任何行时为TRUE
q %ROWCOUNT – SQL 语句影响的行数
q %ISOPEN - 游标是否打开,始终为FALSE
举例说明:
declare
v_empno emp.empno %type:=7000;
begin
update emp set ename='fxe' where empno=v_empno;
if SQl%found then
dbms_output.put_line(SQL%rowcount||'Delete Ok!');
end if;
if SQL%notfound then
dbms_output.put_line('雇员编号'||v_empno||'不存在');
end if;
end;
--------------------执行结果如下--------------------------
4. 显示游标操作:
(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;
-----------------------------------执行结果如下图--------------------------------------------------------
5带参数的显示游标
例:
declare
destination varchar2(20);
cursor emp_cur(dest varchar2)
is select * from emp where empno=dest;
empRecord emp%rowtype;
begin
destination:=&empno;
open emp_cur(destination);
loop
fetch emp_cur into empRecord;
exit when emp_cur%notfound;
dbms_output.put_line(empRecord.ename);
end loop;
close emp_cur;
end;
----输入参数:7369
-----------------------------------------执行结果--------------------------------------------------
6.使用显示游标更新行
q 允许使用游标删除或更新活动集中的行
q 声明游标时必须使用 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;
--------------------------执行结果---------------------------------------
7.循环游标
q 循环游标用于简化游标处理代码
q 当用户需要从游标中提取所有记录时使用
q 循环游标的语法如下:
FOR <record_index> IN <cursor_name>
<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />LOOP
<executable statements>
END LOOP;
例:
declare
cursor emp_cur is select empno,ename,sal from emp;
begin
for empRecord in emp_cur
loop
dbms_output.put_line(empRecord.empno
||empRecord.ename||empRecord.sal);
end loop;
end;
-------------------执行结果--------------------------------
8.REF游标和游标变量
q REF 游标和游标变量用于处理运行时动态执行的 SQL 查询
q 创建游标变量需要两个步骤:
q 声明 REF 游标类型
q 声明 REF 游标类型的变量
q 用于声明 REF 游标类型的语法为:
TYPE <ref_cursor_name> IS REF CURSOR
[RETURN <return_type>];
q 打开游标变量的语法如下:
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;
--------------------------------------执行结果---------------------------------------
9.游标变量的优点和限制
q 游标变量的功能强大,可以简化数据处理。
q 游标变量的优点有:
q 可从不同的 SELECT 语句中提取结果集
q 可以作为过程的参数进行传递
q 可以进行赋值运算
q 使用游标变量的限制:
q 不能在程序包中声明游标变量
q FOR UPDATE子句不能与游标变量一起使用
q 不能使用比较运算符