Oracle学习----高级篇(四)-----Oracle游标

Oracle游标

游标简介

  • 使用游标,我们可以对具体操作数据,比如查询的结果,对行、列数据进行更加细致的处理。以及对其他DML操作进行判断等操作。

显式游标

set serveroutput on;
--定义游标
declare cursor cu_emp is select empno,ename,sal from emp;
--定义变量,接收数据
			--动态指定内存 %type
            -- e_no emp.empno%type;
               e_no number;
               e_name varchar2(10);
               e_sal number;
begin
  --打开游标
   open  cu_emp;
   --取值(一条语句)
   fetch cu_emp into e_no,e_name,e_sal;
   -- %found loop:如果之前的select语句查询到结果了,就开始循环进行处理。
   while  cu_emp%found loop
     dbms_output.put_line('编号:'||e_no||',姓名:'||e_name||',薪资:'||e_sal);
     fetch cu_emp into e_no,e_name,e_sal;
   end loop;
   --关闭游标
   close cu_emp;
end;
  • 扩展:定义行类型
set serveroutput on;
--定义游标
declare cursor cu_emp is select * from emp where sal>2000 and sal<3000;
--定义变量,接收数据
				--定义动态行类型
               e emp%rowtype;
begin
  --打开游标
   open  cu_emp;
   --取值(一条语句)
   fetch cu_emp into e;
   -- %found loop:如果之前的select语句查询到结果了,就开始循环进行处理。
   while  cu_emp%found loop
     dbms_output.put_line('编号:'||e.empno||',姓名:'||e.ename||',薪资:'||e.sal);
     fetch cu_emp into e;
   end loop;
   --关闭游标
   close cu_emp;
end;

隐式游标

隐式游标的属性返回值类型意义
SQL%ROWCOUNT整型代表DML语句成功执行的数据行数
SQL%FOUND布尔型值为TRUE代表插入、删除、更新或单行查询操作成功
SQL%NOTFOUND布尔型值为TRUE代表插入、删除、更新或单行查询操作未成功
SQL%ISOPEN布尔型DML执行过程中为真,结束后为假
begin
  if sql%isopen then
    dbms_output.put_line('游标打开');
  else
    dbms_output.put_line('游标未打开');
  end if;
end;

在这里插入图片描述

begin
  update emp set ename='马云' where empno=123;
  if sql%rowcount=1 then
    dbms_output.put_line('已更新');
  else
    dbms_output.put_line('未更新');
  end if;
end;

在这里插入图片描述

动态游标

  • 强类型动态游标
--定义动态游标,返回类型为Emp表中的动态行类型       
declare type emptype is ref cursor return emp%rowtype;
        cu_emp emptype;
        e_count number;
        e emp%rowtype;--定义行记录
begin
  select count(*) into e_count from emp where job='PRESIDENT';
  if e_count=0 then 
    open cu_emp for select * from emp;
  else
    open cu_emp for select * from emp where job='PRESIDENT';
  end if;
  fetch cu_emp into e ;
  while  cu_emp%found loop
     dbms_output.put_line('编号:'||e.empno||',姓名:'||e.ename||',薪资:'||e.sal);
     fetch cu_emp into e;
   end loop;
   --关闭游标
   close cu_emp; 
end;

在这里插入图片描述

  • 弱类型动态游标
declare type customType is ref cursor;
        e_count number;
        e emp%rowtype;--定义行记录 
        s salgrade%rowtype;
        cType customType;
begin
  select count(*) into e_count from emp where job='PRESIDENT';
  if e_count=0 then 
    open cType for select * from salgrade;
    fetch cType into s ;
    while  cType%found loop
       dbms_output.put_line('等级:'||s.grade||',最低薪资:'||s.losal||',最高薪资:'||s.hisal);
       fetch cType into e;
    end loop;
   --关闭游标
    close cType;
  else
    open cType for select * from emp where job='PRESIDENT';
    fetch cType into e ;
    while  cType%found loop
       dbms_output.put_line('编号:'||e.empno||',姓名:'||e.ename||',薪资:'||e.sal);
       fetch cType into e;
    end loop;
   --关闭游标
   close cType; 
  end if;
end;  

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值