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;
教培网





