`
hecal
  • 浏览: 80062 次
社区版块
存档分类
最新评论

oracle PL/SQL之隐式游标和ref游标总结

 
阅读更多
游标是构建在PL/SQL中,用来查询数据,获取记录集的指针。它让开发者 一次访问结果集中一行记录。 在oracle中提供了两种游标: 1 静态游标 2 ref游标 静态游标:静态游标是在编译的时候就被确定。然后把结果集复制到内存中 静态游标又分为两种:隐式游标和显示游标。 ref游标:ref游标是在运行的时候加载结果集 先来看看静态游标中的隐式游标 在PL/SQL中为所有的SQL数据操纵语句(包括返回一行的select)隐式声明游标 称为隐式游标。主要原因是用户不能直接命名和控制此类游标。当用户在PL/SQL 中使用数据操纵语句(DML)时,oracle预先定义一个名称为SQL的隐式游标,通过 检查隐式游标的属性获取与最近执行的SQL语句相关信息。 在执行DML语句之后,隐式游标属性返回信息。隐式游标属性包括: %found %notfound %rowcount %isopen 1 %found 只有DML语句影响一行或多行时,%found属性才返回true declare num number; begin update emp set empno=123 where empno=111; if sql%found then dbms_output.put_line('存在记录'); else dbms_output.put_line('不存在记录'); end if; end; 2 %notfound %notfound属性作用正好跟%found属性相反。如果DML语句没有影响任何行数 ,则%notfound属性返回true. declare begin delete from emp where empno=111; if sql%notfound then dbms_output.put_line('删除失败'); end if; end; 3 %rowcount %rowcount属性返回DML语句影响的行数。如果DML语句没有影响任何行数 ,则%rowcount属性将返回0。 declare num number; begin update emp set empno=123 where empno=111; if sql%rowcount=0 then dbms_output.put_line('不存在记录'); else dbms_output.put_line('存在记录'); end if; end; 4 %isopen %isopen属性判断SQL游标是否已经打开。在执行SQL语句之后,oracle自动关闭SQL 游标,所以隐式游标的%isopen属性始终为false. 在PL/SQL中向标准的select语句增加单独的into子句,就可以将从表或视图中查询 记录赋予变量或行变量。需要注意的是select ..into 语句结果必须有且只能有一行。 如果查询没有返回行,PL/SQL将抛出no_data_found异常。如果查询返回多行,则抛出 too_many_rows 异常。如果抛出异常,则停止执行,控制权转移到异常处理部分(没有 异常处理,则程序中断)。在引发异常时,将不使用属性%found,%notfound,%rowcount来查明DML语句是否 已影响了行数。 declare num number; begin select empno into num from emp where empno=111; if sql%rowcount=0 or sql%notfound then dbms_output.put_line('不存在记录'); else dbms_output.put_line('存在记录'); end if; end; --------------------------------------------- 显示游标 显示游标是由用户显示声明的游标。根据在游标中定义的查询,查询返回的行集合可以 包含零行或多行,这些行称为活动集。游标将指向活动集中的当前行。 显示游标的操作过程。使用显示游标的4个步骤: (1)声明游标 (2)打开游标 (3)从游标中获取结果集 (4)关闭游标 cursor cursor_name [(parameter[,parameter])] [return return_type] is select_statement; cursor_name 指游标的名称。 parameter为游标指定输入参数。 return_type 定义游标提取行的行类型。 select_statement 为游标定义查询语句。 open 游标名称 fetch 从游标中提取行 close 关闭游标 1 打开游标,执行游标中定义的查询语句,绑定输入参数,将游标指针指 向结果集的BOF位置。 open cursor_name [parameters] 2fetch 在打开游标之后,可以从游标中提取记录 fetch cursor_name into variable_name; fetch 是提取结果集中一行记录存储在变量中。每次提取之后,结果集指针 就向前移动一行。 3 close 在处理游标中的所有行之后,必须关闭游标,以释放分配给游标的所有资源。 close cursor_name 用户可以通过检查游标属性来确定游标的当前状态。显示游标的属性如下: %found:如果执行最后一条fetch语句,成功返回行,则%found属性为true。 %notfound:如果执行最后一条fetch语句,未能提取行,则%notfound属性为true。 %isopen:如果游标已经打开,则返回true,否则返回false。 %rowcount:返回到目前为止游标提取的行数。%rowcount为数字类型属性。在第一 次获取之前,%rowcount为零。当fetch语句返回一行时,则该数加1。 declare info emp%rowtype; cursor my_cur is select * from emp where empno=111; begin open my_cur; dbms_output.put_line(my_cur%rowcount); loop if my_cur%isopen then fetch my_cur into info; exit when my_cur%notfound; dbms_output.put_line(info.empno); dbms_output.put_line(my_cur%rowcount); end if; end loop; close my_cur; end; --------------------------------------------------- 使用显示游标删除或更新 使用游标时,如果处理过程中需要删除或更新。在定义游标查询语句时 必须使用select..for update语句,而在执行delete或update时使用 where current of 子句指定游标当前行。 cursor cursor_name is select_statement for update[of column] wait/nowait 在使用for update 子句声明游标之后,可以使用以下语法更新行 update table_name set column_name=column_value where current of cursor_name; update命令中使用的列必须出现在for update of 子句中 select 语句必须只包括一个表,而且delete和update语句只有在打开游标并且提取 特定行之后才能使用。 declare cursor cur_emp is select * from emp where sal<2000 for update of sal; num emp%rowtype; begin open cur_emp; loop fetch cur_emp into num; exit when cur_emp%notfound; update emp set sal=2000 where current of cur_emp; end loop; close cur_emp; end; ------------------------------------------- 带参数的显示游标 PL/SQL中允许显示游标接受输入参数。用于声明带参数的显示游标语法 cursor cursor_name[<param_name> data_type] [return <return type>] is select_statement declare dept_num emp.deptno%type; emp_numemp.empno%type; emp_nam emp.ename%type; cursor emp_cur(deptparam number) is select empno,ename from emp where deptno=deptparam; begin dept_num :=&部门编号; open emp_cur(dept_num); loop fetch emp_cur into emp_num,emp_nam; exit when emp_cur%notfound; dbms_output.put_line(emp_num||' '||emp_nam); end loop; close emp_cur; end; ----------------------------------------- 可以使用循环游标来简化显示游标。循环游标隐式打开显示游标(不需要open) 自动从结果集提取记录,然后处理完所有记录自动关闭游标。循环游标自动创建 %rowtype类型的变量并将此变量用做记录的索引。 循环游标语法如下: for record_index in cursor_name record_index是PL/SQL自动创建的变量,此变量的属性声明为%rowtype类型。作用 域for循环之内。 循环游标的特性有: 从游标中提取所有记录之后自动关闭游标。 提取和处理游标中每一条记录 提取记录之后%notfound属性为true则退出循环。如果未有结果集,则不进入循环。 declare cursor emp_cur is select * from emp; begin for temp in emp_cur loop dbms_output.put_line(temp.ename); end loop; end; 循环游标自动打开,提取,关闭。只适用于静态游标 ---------------------------------------- ref游标 隐式游标和显示游标都是静态定义的。它们在编译的时候结果集就已经被确定。 如果想在运行的时候动态确定结果集,就要使用ref游标和游标变量。 创建ref游标需要两个步骤:1 声明ref cursor类型 2 声明 ref cursor类型变量。 语法如下: type ref_cursor_name is ref cursor [return record_type] 其中,return 用于指定游标提取结果集的返回类型。有return表示是强类型ref游标, 没有return表示是弱类型的游标。弱类型游标可以提取任何类型的结果集。 定义游标变量之后,就可以在PL/SQL执行部门打开游标变量 open cursor_name for select_statement; declare type emp_cur is ref cursor; my_cur emp_cur; num number; selection varchar(2):='&请输入编号'; begin if selection='1' then dbms_output.put_line('员工信息'); open my_cur for select deptno from emp; elsif selection='2' then dbms_output.put_line('部门信息'); open my_cur for select deptno from dept; else dbms_output.put_line('请输入员工信息(1)或门部信息(2)'); end if; fetch my_cur into num; while my_cur%found loop dbms_output.put_line(num); fetch my_cur into num; end loop; close my_cur; end; -------------------------------------------- 在PL/SQL中可以执行动态SQL语句,execute immediate 语句只能语句处理返回单行 或没有返回的SQL语句,ref游标则可以处理返回结果集的动态SQL。ref游标的声明 方法与普通ref游标相同,只是在open时指定了动态SQL字符串。 open cursor_name for dynamic_select_string [using bind_argument_list] declare type sql_cur is ref cursor; my_cur sql_cur; emp_info emp%rowtype; sql_string varchar2(100):='&请输入查询字符串'; begin open my_cur for sql_string; loop fetch my_cur into emp_info; exit when my_cur%notfound; dbms_output.put_line(emp_info.ename); end loop; close my_cur; end; 游标变量的特点: (1)游标变量可以从不同的结果集中提取记录 (2)游标变量可以做为存储过程参数进行传递 (3)游标变量可以引用游标的所有属性 (4)游标变量可以进行赋值运算 使用游标变量也有一定的限制 (1)for update 子句不能与游标变量一起使用 (2)不允许在程序包使用游标变量(可以声明游标类型) (3)另一台服务器上的子过程不能接受游标变量参数 (4)不能将NULL值赋给游标变量。 (5)游标变量不能使用比较运算符。 (6)数据库中的列不能存储游标变量。 总结: (1)游标是使用在PL/SQL中,是用来查询数据,获取结果集的指针 (2)游标类型包括隐式游标,显示游标和ref游标。 (3)游标属性包括%found,%notfound,%rowcount,%isopen (4)PL/SQL自动定义隐式游标,以获取最近执行SQL语句信息。 (5)循环游标简化处理游标中所有行的查询。 (6)在声明ref游标时,不要将它与select 语句相关联。
分享到:
评论

相关推荐

    静态、动态sql及各种游标

    隐式游标是指在PL/SQL中自动打开和关闭的游标,例如SELECT、INSERT、UPDATE、DELETE等语句。隐式游标的优点是简单易用,缺点是灵活性不高,不能在运行时动态生成游标的内容。 例如: ```sql BEGIN UPDATE t_...

    PL/SQL手册———oracle10g

    - **隐式游标**:系统自动创建和管理的游标,通常用于简单的`SELECT INTO`语句。 - **Ref Cursor**:引用游标,用于在子程序间传递查询结果集。 ##### 异常处理 异常处理是PL/SQL的一个强大功能,可以处理运行时...

    13oracle的PL/SQL编程-定义并使用变量 PPT

    在Oracle的PL/SQL编程中,变量是存储数据的基本单元,它们允许我们在程序中保存信息,以便在不同的时刻访问或修改。本节将深入探讨如何在PL/SQL中定义和使用变量,以及相关的概念和最佳实践。 1. 变量的类型 在PL/...

    PL/SQL 基本语句

    - **隐式游标**:自动创建并管理,主要用于SQL语句返回单行数据的情况。 - **游标变量和REFCURSOR**:用于传递游标给存储过程或函数,可以返回多行数据。 - **游标表达式**:支持对游标的高级操作,如FOR循环中...

    Oracle存储过程实例使用显示游标

    游标有多种类型,如隐式游标(默认与每个PL/SQL块关联)和显示游标(如上例所示,需要显式声明和管理)。显示游标提供了更大的灵活性,可以控制游标的打开、关闭、提取和定位。 异常处理部分使用了PL/SQL的`WHEN ...

    PL/SQL 基础.doc

    PL/SQL 基础,一个不错的 PL/SQL 参考手册。内容预览: ---- 第一章 PL/SQL 简介 ---- 1. Oracle应用编辑方法概览 1) Pro*C/C++/... : C语言和数据库打交道的方法,比OCI更常用; 2) ODBC 3) OCI: C语言和...

    非常详细的Oracle游标整理

    这里详细介绍了Oracle中的三种游标类型:隐式游标、显式游标和REF游标。 1. **隐式游标**: - 隐式游标是Oracle自动管理和使用的,不需要程序员显式声明。当执行DML(Insert、Delete、Update、Merge into)操作时...

    oracle Chapter 7 异常和游标管理.pptx

    游标分为三种类型:隐式游标、显式游标和REF游标。隐式游标由Oracle自动处理,主要用于DML操作和返回单行查询结果。显式游标由程序员声明,可以更精确地控制游标的打开、获取数据(FETCH)和关闭(CLOSE)过程。而...

    oracle 游标 深入浅出 详解 精析 示例

    在PL/SQL中,游标分为显式游标和隐式游标。显式游标需要明确地声明、打开、提取和关闭,而隐式游标则由系统自动管理,通常在单行查询结果中使用。 **4.1 游标概念** 游标本质上是在内存中为SQL查询结果分配的一个...

    北大青鸟Oracle游标

    1. **隐式游标**:每当在PL/SQL块中执行DML语句(如INSERT、UPDATE、DELETE)时,Oracle会自动创建一个隐式游标。隐式游标无需显式声明,系统会自动管理其打开、关闭,并提供一些属性供查询,如%NOTFOUND、%FOUND和%...

    oracle异常和游标管理.pptx

    2. 隐式游标:PL/SQL自动为DML操作(如INSERT、UPDATE、DELETE)打开和关闭,提供对受影响行的基本信息,例如%NOTFOUND、%FOUND和%ROWCOUNT属性。 3. 显式游标:程序员手动声明、打开、读取、关闭,可以提供更灵活的...

    ORACLE显式游标和动态游标的使用.pdf

    - 隐式游标在PL/SQL中使用SELECT或DML语句时自动使用,但只返回一行记录。在本文中不作深入讨论。 3. **动态游标**(参照游标或REF游标): - 动态游标在运行时才能确定查询,或者查询条件依赖于其他游标的返回值...

    Oracle数据库游标使用.rar

    1. **隐式游标**:每当执行一个SQL语句时,Oracle都会自动使用隐式游标。系统会自动处理游标的打开、提取和关闭,开发者通常无需直接管理。 2. **显式游标**:显式游标允许程序员更精细地控制数据处理过程,包括...

    Oracle PLSQL开发基础

    - **课程定位**: 本课程旨在帮助已经掌握了Oracle基本概念和Oracle SQL语言的学习者深入理解并应用PL/SQL语言。 - **目标学员**: 主要面向需要在平台上进行数据查询和代码阅读的测试人员。 - **学习成果**: - 理解...

    Oracle游标语法总结.doc

    显式游标需要明确地声明和打开,而隐式游标则不需要明确声明, Oracle 会自动创建。 二、Oracle 游标分类 1. 静态游标:静态游标可以进一步分为显式游标和隐式游标。 - 显式游标:需要明确地声明和打开,例如 `...

    oracle中游标的使用

    1. **隐式游标**:在PL/SQL中,当我们执行DML操作(如INSERT、UPDATE、DELETE)时,Oracle会自动创建隐式游标。我们可以使用隐式游标的几个内置属性来检查操作状态,例如: - `%FOUND`:如果上一个DML操作影响了...

Global site tag (gtag.js) - Google Analytics