游标提供了一种从表中检索数据并进行操作的灵活手段,游标主要是用在服务器上,处理由客户端发送到服务器端的SQL语句,或是批处理、存储过程、触发器中的数据处理请求,通过游标PL/SQL可以一次处理查询结果的一行,并可对当前数据执行特定的操作。
一、 显示游标
显示游标是由客户声明和操作的一种游标,通常用于操作查询结果集(select 语句返回的结果集)用它处理数据的步骤包括:声明游标、打开游标、读取游标、关闭游标;其中读取游标可能是返复的操作,因为游标每次只能读取一行数据,所以多条记录时需要反复读,直到游标读不到数据为止。
- 声明游标
声明游标
主要包括游标名称和为游标提供结果集的select语句
--cur_name 游标名称
-- ret_type 执行游标操作后返回的值类型,可选xiang
-- input_param1 游标的输入参数 格式为
-- param_name [in] datatype [{
:= | defaut} param_value]
cursor cur_name [(input_param1[,input_parm2]....)]
[ return ret_type ]
is select_sentence;
eg : 声明一个游标,用来读取emp表中职务为销售员(SALESMAN)的雇员信息
declare
cursor cur_emp(var_job in varchar2:= 'SALESMAN')
is select empn,ename,sal
from emp
where job = var_job;
- 打开游标
在游标声明完成之后才能打开游标
-- cur_name 要打开游标的名称
--pram_value 指定输入参数的值,是一个可选参数,在声明游标时定义了输入参数,并初始化其值,在此处省略输入参数的值,则表示将使用输入参数的初始值
open cur_name([pram_value [,param_valu2]...])
open cur_emp('MANAMANAGER')
- 读取游标
读取游标就是逐行将结果集中的数据保存到变量当中,语法格式如下
-- variable 一个变量列表或者“记录”变量(RECORD类型)
fetch cur_name into {
variable}
刚刚打开游标时,指针指向结果集的第一行,当时用fetch…into 读取完数据后,游标中的指针自动指向下一行数据。
eg :声明一个检索emp表中雇员信息的游标,然后打开游标,并制定检索职务为‘MANAGER’ 的雇员信息,接着用fetch into 语句和while语句循环读取游标中所有雇员的信息
declare
cursor cur_emp(var_job in varchar2:= 'SALARMAN')
is select empno,ename,sal
from emp
where job = var_job;
type record_emp is record
(
var_empno emp.empno%type,
var_ename emp.ename%type,
var_sal emp.sal%type)
empinfo record_emp;
begin
open cur_emp('MANAGER');
fetch cur_emp into empinfo;
while cur_emp %found loop
dbms_output.put_line(empinfo.var_ename||'标号是'||empinfo.var_empno||'工资为'||empinfo.var_sal);
end loop;
close cur_emp;
end;
- 游标的属性
无论是显示游标还是隐式游标,都具有%found ,%notfound,%isopen,%rowcount 这四个属性,这四个属性可以获得SQL语句的执行结果以及游标的状态信息
- %found 布尔属性,如果SQL语句至少影响到一行数据,则 该属性为true否则为false
- %notfound 与%found 相反
- %isopen 布尔属性 游标开启为true 否则为false
- %rowcount 数字型属性,返回受SQL语句影响的行数
eg: 声明一个游标,用于检索指定员工编号的雇员信息,然后使用游标的%found 属性,判断是否检测到指定员工的信息
declarevar_ename varchar2(20) ;
var_job varchar2(20) ;
cursor cur_emp
is select ename,job
from emp
where empno= 7396;
begin
open cur_emp;
fetch cur_emp into var_ename,var_job;
if cur_emp %found then
dbms_output.put_line('编号7396员工的名字'||var_ename||'工职务为'||var_job);
else
dbms_output.put_line('无数据记录');
end if;
close cur_emp;
end;
二 、隐式游标
执行一个SQL语句时,orcale会自动传建一个隐式游标,这个游标是内存中处理该语句的工作区域,隐式游标主要是处理数据操作语言如(UPDATE 、DELETE )的执行结果,当然特殊的情况也可以处理select语句的查询结果。隐式游标也有属性,在使用隐式游标时需要加上隐式游标的默认名称 sql。
eg: 把emp表中销售人员(‘SALESMAN’)的工资上调%20,然后使用游标%rowcount属性输出上调工资的员工数量。
begin
update emp set sal =sal*1.2
where job = 'SALESMAN';
if sql%notfound then
dbms_output.put_line('没有员工上调工资');
else
dbms_output.put_line('上调工资人数为'||sql%rowcount);
end if;
end;
三 通过for语句循环游标
- 循环隐式游标
eg ; 使用for语句和隐式游标,检索出职务是销售员员工信息
set serveroutput on
begin
for emp_record in (select empno,ename,sal from emp where job = 'SALESMAN')
loop
dbms_output.put_line('员工编号'||emp_record.empno);
dbms_output.put_line('员工姓名'||emp_record.ename);
dbms_output.put_line('员工工资'||emp_record.sal);
end loop:
end;
- 循环显示游标
在 for 语句中遍历显示游标中的数据时,通常在in 关键字后 提供游标的名称,语法格式如下
for var_auto_record in cur_name loop
plsql_sentence;
end loop;
eg : 使用显示游标和for 语句检索出部门编号是30 的雇员信息
declare
cursor cur_emp is
select * from emp where empno = 30;
begin
for item in cur_emp loop
dbms_output.put_line('员工编号'||item .empno);
dbms_output.put_line('员工姓名'||item .ename);
dbms_output.put_line('员工工资'||item .sal);
end loop;
end ;