当前位置: 代码迷 >> 综合 >> OraclePL/Sql编程——游标
  详细解决方案

OraclePL/Sql编程——游标

热度:99   发布时间:2023-11-15 03:55:53.0

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

一、 显示游标
显示游标是由客户声明和操作的一种游标,通常用于操作查询结果集(select 语句返回的结果集)用它处理数据的步骤包括:声明游标、打开游标、读取游标、关闭游标;其中读取游标可能是返复的操作,因为游标每次只能读取一行数据,所以多条记录时需要反复读,直到游标读不到数据为止。
在这里插入图片描述

  1. 声明游标
    声明游标
    主要包括游标名称和为游标提供结果集的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;
  1. 打开游标
    在游标声明完成之后才能打开游标
-- cur_name 要打开游标的名称
--pram_value 指定输入参数的值,是一个可选参数,在声明游标时定义了输入参数,并初始化其值,在此处省略输入参数的值,则表示将使用输入参数的初始值
open cur_name([pram_value [,param_valu2]...])
open cur_emp('MANAMANAGER'
  1. 读取游标
    读取游标就是逐行将结果集中的数据保存到变量当中,语法格式如下
-- 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;
  1. 游标的属性
    无论是显示游标还是隐式游标,都具有%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语句循环游标

  1. 循环隐式游标
    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;
  1. 循环显示游标
    在 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 ;