Oracle 数据库 - PL/SQL 游标

北慕城南 提交于 2019-12-12 11:04:45

目录

PL/SQL 游标

1、显式游标

1)、声明游标

2)、打开游标

3)、读取游标

4)、关闭游标

2、游标属性

3、隐式游标

4、通过 for 语句循环游标

 

实例——使用游标查询工资小于 1000 元的员工工资

实验:游标提取比指定员工工资少的员工信息


 

PL/SQL 游标

游标提供了一种从表中检索数据并进行操作的灵活手段,游标主要用在服务器上,处理由客户端发送给服务器端的 SQL 语句,或是批处理、存储过程、触发器中的数据处理请求。游标的作用就相当于指针,通过游标 PL/SQL 程序可以一次处理查询结果集中的一行,并可以对该行数据执行特定操作,从而为用户在处理数据的过程中提供很大方便。

在 Oracle 中,通过游标操作数据主要使用显式游标和隐式游标。另外,还包括具有引用类型特性的 REF 游标。在这里仅介绍前两种经常使用的显式游标和隐式游标。

 

1、显式游标

显式游标是由用户声明和操作的一种游标,通常用于操作查询结果集(即由 select 语句返回的查询结果),使用它处理数据的步骤包括:声明游标、打开游标、读取游标和关闭游标4个步骤。其中读取游标可能是个反复操作的步骤,因为游标每次只能读取一行数据,所以对于多条记录,需要反复读取,直到游标读取不到数据为止

 

1)、声明游标

声明游标主要包括游标名称和为游标提供结果集的 select 语句。因此,在声明游标时,必须指定游标名称和游标所使用的 select 语句,其语法格式为:

cursor cur_name [(input_parameter1 [,input_parameter2 ]...)] 
[ return ret_type ]
is select_sentence ;



--cur_name : 表示所声明的游标名称
--ret_type : 表示执行游标操作后的返回值类型,是一个可选项
--select_sentence : 游标所使用的 select 语句,它为游标的反复读取提供了结果集

--input_parameter1 : 作为游标的 “输入参数” ,可以有多个,这是一个可选项。
--它指定用户在打开游标后向游标中传递的值, 该参数的定义和初始化为:
--para_name [in] datatype [{:= | default} para_value] 

--其中 ,para_name 表示参数名称,其后面的关键字 in 表示输入方向,可以省略;
--datatype 表示参数的数据类型,但数据类型不可以指定长度,否则程序会报错;

--para_value 表示该参数的初始值或默认值,它也可以是一个表达式;para_name 参数的初始值既可以以常规的方式赋值(:=)
--也可以使用关键字 default 初始化默认值。

与声明变量一样,定义游标也应该放在 PL/SQL 块的 declare 部分

例:声明一个游标,用来读取 emp 表中职务为销售员(SALESMAN)的雇员信息:

declare
 cursor cur_emp(var_job in varchar2:='SALESMAN')
  is select empno,ename,sal from scott.emp
  where job=var_job ;

在上面的代码中,声明了一个名称为 cur_emp 的游标,并定义一个输入参数 var_job(类型为 varchar2 ,但不可以指定长度),该参数用来存储雇员的职务(其初始值为 SALESMAN),然后使用 select 语句检索职务是销售员的结果集,以等待游标逐行读取它。

 

2)、打开游标

在游标声明完毕之后,必须打开才能使用,打开游标的语法格式如下:

open cur_name [(para_value1 [,para_value2]...)] ;




--cur_name : 要打开的游标名称

--para_value1 : 指定“输入参数”的值,会根据声明游标时的实际情况,可以是一个或多个,这是一个可选项。
--如果在声明游标时定义了“输入参数”,并初始化其值,而在此省略“输入参数”的值,则表示游标将使用“输入参数”的初始值;
--若在此处指定“输入参数”的值,则表示游标将使用这个指定的“参数值”。

在打开游标的过程中,程序首先将符合条件的记录送入内存中,然后再将“指针”指向第一条记录。紧接着上一个例子中的代码,打开游标的代码为:

open cur_emp('MANAGER');

上面这条语句表示打开游标 cur_emp ,然后给游标的“输入参数”赋值为 “MANAGER”,当然这里可以省略“('MANAGER')”,这样就表示“输入参数”的值仍然使用其初始值(即 SALESMAN )。

 

3)、读取游标

当打开一个游标之后,就可以读取游标中的数据了,读取游标就是逐行将结果集中的数据保存到变量中。读取游标使用 fetch...into 语句,其语法格式为:

fetch cur_name into { variable };



--cur_name : 要读取的游标名称
--variable : 表示一个变量列表或 “记录”变量(record类型),Oracle 使用“记录”变量来存储游标中的数据,要比使用变量列表方便得多。

游标中包含一个数据行指针,它用来指向当前数据行。刚刚打开游标时,指针指向结果集中的第一行,当使用 fetch...into 语句读取数据完毕之后,游标中的指针将自动指向下一行数据。这样就可以在循环结构中使用 fetch...into 语句来读取数据,这样每一次循环都会从结果集中读取一行数据,直到指针指向结果集中最后一条记录之后为止(实际上,最后一条记录之后是不存在的,是空的,这里只是表示遍历完所有的数据行),这这时游标的 %found 属性值为 false (属性在后续部分介绍)。

例:声明一个检索 emp 表中雇员信息的游标,然后打开游标,并指定检索职务是 “MANAGER”的雇员信息,接着使用 fetch...into 语句和 while 循环读取游标中的所有雇员信息,最后输出读取的雇员信息:

对于上例,在 while 语句之前,首先使用 fetch ... into 语句将游标中的指针移动到结果集中的第一行,这样属性 %found 的值就为 true ,从而保证 while 语句的循环判断条件成立。

 

4)、关闭游标

游标使用完毕,需要关闭,以释放系统资源,比如 select 语句返回的结果集等,其语法格式为:

close cur_name

 

2、游标属性

无论是显式游标还是隐式游标,都具有 %found、%notfound、%isopen 和 %rowcount 四个属性,通过这 4 个属性可以获知 SQL 语句的执行结果以及该游标的状态信息。%found:布尔型属性,如果 SQL 语句至少影响到一行数据,则该属性为 true ,否则为 false ;%notfound:布尔型属性,与 %found 属性的功能相反;%rowcount:数字型属性,返回受 SQL 语句影响的行数%isopen:布尔型属性,当游标已经打开时返回 true,关闭时则为 false 。

例:声明一个游标,用于检索指定员工编号的雇员信息,然后使用游标的 %found 属性来判断是否检索到指定员工编号的雇员信息:

在上面的例子中,若检索到 7499 的雇员信息,则 select 语句会返回一行数据,这时游标 cur_emp 的 %found 属性值为 true ;若检索不到编号为 7499 的雇员信息,则 select 语句无数据行返回,这时游标 cur_emp 的 %found 属性值为 false 。

 

3、隐式游标

执行一个 SQL 语句时,Oracle 会自动创建一个隐式游标。这个游标是内存中处理该语句的工作区域。隐式游标主要是处理数据操纵语句(如 update、delete 语句)的执行结果,当然特殊情况下,也可以处理 select 语句的查询结果。由于隐式游标也有属性,当使用隐式游标的属性时,需要在属性前面加上隐式游标的默认名称——sql。在实际的 PL/SQL 编程中,经常使用隐式游标来判断更新数据行或删除数据行的情况

例:在 scott 模式下,把 emp 表中销售员(即 SALESMAN )的工资上调 20%,然后使用隐式游标 sql 的%rowcount 属性输出上调工资的员工数量

在上面的代码中,标识符 “sql” 就是 update 语句在更新数据过程中所使用的隐式游标,它通常处于隐藏状态,是由 Oracle 系统自动创建的。当需要使用隐式游标的属性时,标识符 “sql” 就必须显式地添加到属性名称之前。另外,无论是隐式游标还是显示游标,它们的属性总是反映最近的一条 SQL 语句的处理结果。因此在一个 PL/SQL 块中出现多个 SQL 语句时,游标的属性值只能反映出紧挨着它上面那条 SQL 的处理结果。

 

4、通过 for 语句循环游标

在使用隐式游标或显式游标处理具有多行数据的结果集时,用户可以配合 for 语句来完成。在使用 for 语句遍历游标中的数据时,可以把它的计时器看作是一个自动的 record 类型的变量

1)、在 for 语句中遍历游标中的数据时,通常在关键字 “in” 的后面提供由 select 语句检索的结果集,在检索结果集的过程中,Oracle 系统会自动提供一个隐式的游标 sql 。

例:使用隐式游标和 for 语句检索出职务是销售员的雇员信息并输出

 

2)、在 for 语句中遍历显式游标中的数据时,通常在关键字 “in” 的后面提供游标的名称,其语法格式如下: 

for var_auto_record in cur_name loop
 plsqlsentence ;
end lopp ;



--var_auto_record : 自动的 record 类型的变量,可以是任意合法的变量名称
--cur_name : 指定的游标名称
--plsqlsentence : PL/SQL 语句

例:使用显式游标和 for 语句的检索出部门编号是 30 的雇员信息并输出:

在使用游标(包括显式和隐式)的 for 循环中,可以声明游标,但不用进行打开游标、读取游标和关闭游标等操作,这些由 Oracle 系统内部自动完成

 

实例——使用游标查询工资小于 1000 元的员工工资

使用游标查询 scott 模式下的 emp 表,实现查询工资小于 1000 元的员工工资:

这是显式游标,下面写个隐式游标的获取:

 

实验:游标提取比指定员工工资少的员工信息

使用游标查询 scott 模式下的 emp 表,获取工资小于编号为 7698 的员工编号、姓名和工资信息。

这是显式游标,下面写个隐式游标的获取:

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!