欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-20 10:42:10
...

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;

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

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;

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

动态游标

  • 强类型动态游标
--定义动态游标,返回类型为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;

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

  • 弱类型动态游标
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;  

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

相关标签: Oracle游标