北大青鸟广州俊星校区

7x24小时咨询热线

400-660-3310

当前位置 : 好学校 北大青鸟广州俊星校区 学习资讯 资讯详情

oracle的两种游标类型介绍

2014-02-28

游标用于处理查询结果集中的数据

Oracle中提供了两种游标类型,它们是:

静态游标:静态游标是在编译时知道Select语句的游标。静态游标又分为两种类型,隐式游标和显式游标。

REF游标:很多时候用户需要为游标使用的查询直到运行的时候才能确定,可以使用REF游标(引用游标)和游标变量满足这个要求。为了使用引用游标,必须声明游标变量。有两种类型的REF游标,强类型REF游标和弱类型REF游标。

1、隐式游标:PL/SQL为所有SQL数据操纵语句(包括返回一行的Select)隐式声明游标。用户不能直接命名和控制此类游标。隐式游标名为SQL。

隐式游标属性:

(1)、%FOUND只有在DML语句影响一行或多行时,%FOUND属性才返回TRUE。

示例1:如果有行被更新,SQL%FOUND就返回真并打印相应信息。

begin

updateempsetsal=sal+8whereempno=7900;

ifsql%foundthen

dbms_output.put_line('表已更新');

else

dbms_output.put_line('编号未找到');

endif;

end;

(2)、%NOTFOUND此属性与%FOUND属性的作用正好相反。如果DML语句没有影响任何行,则%NOTFOUND属性返回TRUE。

(3)、%ROWCOUNT此属性返回DML语句影响的行数。如果DML语句没有影响任何行,则%ROWCOUNT属性将返回0。

示例2:使用%ROWCOUNT属性。

begin

updateempsetsal=sal+8whereempno=7900;

ifsql%foundthen

dbms_output.put_line('表已更新,更新了'||SQL%ROWCOUNT||'行');

else

dbms_output.put_line('编号未找到');

endif;

end;

(4)、%ISOPEN此属性返回游标是否已打开的值。隐式游标的%ISOPEN属性始终为FALSE。

2、显式游标

使用显式游标的4个步骤是:

(1)、声明游标。

(2)、打开游标。

(3)、从游标中获取记录

(4)、关闭游标

声明显式游标语法:

CURSORcursor_name[(parameter[,parameter]...)]

[RETURNreturn_type]ISselect_statement;

其中:cursor_name指游标的名称。

parameter用于为游标指定输入参数。

return_type定义游标提取的行的类型。

select_statement指游标定义的查询语句。

打开游标语法:

OPENcursor_name[(parameters)];

从游标中获取记录语法:

FETCHcursor_nameINTOvariables;

其中:cursor_name指游标的名称。

variables是变量名。

关闭游标语法:

CLOSEcursor_name;

显式游标的属性如下:

(1)、%FOUND如果执行后一条FETCH语句成功返回行,则%FOUND的值为TRUE。

(2)、%NOTFOUND如果执行后一条FETCH语句未能提取行时,则%NOTFOUND的值为TRUE。

(3)、%ROWCOUNT返回到目前为止游标提取的行数。在第一次获取之前,%ROWCOUNT为零。当FETCH语句返回一行时,则该数加1。

(4)、%ISOPEN如果游标已经打开,则返回TRUE,否则返回FALSE。

我们来一起看一个稍微复杂的例子

setserveroutputon

declare

cursorcur_deptisselect*fromdeptorderbydeptno;--定义游标

cursorcur_emp(mydeptnoinnumber)is

selectename,salfromempwheredeptno=mydeptno;

dept_recdept%rowtype;--声明记录类型变量

emp_recemp%rowtype;

mydeptnodept.deptno%type;

mydeptnamedept.dname%type;

myempnoemp.empno%type;

myenameemp.ename%type;

mysalemp.sal%type;

mytotalsalemp.sal%type;

begin

opencur_dept;--打开游标

loop

fetchcur_deptintodept_rec;--提取游标中的数据到记录类型中

exitwhencur_dept%notfound;

dbms_output.put_line('departnois:'||dept_rec.deptno);

opencur_emp(dept_rec.deptno);

loop

fetchcur_empintomyename,mysal;

exitwhencur_emp%notfound;

dbms_output.put_line('employeenameis:'||myename);

dbms_output.put_line('salaryis:'||mysal);

--mytotalsal:=mytotalsal+mysal;

endloop;

closecur_emp;--关闭游标

--dbms_output.put_line('emploueesalaryis:'||mytotalsal);

endloop;

closecur_dept;

end;

三ref游标

REF游标和游标变量用于处理运行时动态执行的SQL查询

创建游标变量需要两个步骤:

声明REF游标类型

声明REF游标类型的变量

注意:不能赋予游标具体的sql语句

看一个例子

setserveroutputon

declare

typeemp_curisrefcursor;--声明REF游标类型

emp_cur_objemp_cur;--声明REF游标类型的变量

emp_recemp%rowtype;

dept_recdept%rowtype;

v_salemp.sal%type;

begin

v_sal:='&inputsal';

ifv_sal>3000then

openemp_cur_objforselect*fromemp;--给游标赋予动态的sql语句

loop

fetchemp_cur_objintoemp_rec;

exitwhenemp_cur_obj%notfound;

dbms_output.put_line('employeenameis'||emp_rec.ename);

endloop;

else

openemp_cur_objforselect*fromdept;--给游标赋予动态的sql语句

loop

fetchemp_cur_objintodept_rec;

exitwhenemp_cur_obj%notfound;

dbms_output.put_line('部门:'||dept_rec.dname);

endloop;

dbms_output.put_line('工资小于3000只查看部门信息');

endif;

closeemp_cur_obj;

end;

收藏
分享到:

相关课程

北大青鸟广州俊星校区

北大青鸟广州俊星校区

认证等级

信誉良好,可安心报读

北大青鸟广州俊星校区

已获好学校V2信誉等级认证

信誉值

  • (60-80)基础信誉积累,可放心报读
  • (81-90)良好信誉积累,可持续信赖
  • (91-100)充分信誉积累,推荐报读

与好学校签订读书保障协议:

  • 100%
  • 4
  • 3478
在线咨询
;