oracle 游标和函数1

游标是一种PL/SQL控制结构;可以对SQL语句的处理进行显示控制,便于对表的行数据逐条进行处理。游标并不是一个数据库对象,只是存留在内存中。

由于使用游标有许多种方法,这里只挑选较常用的进行介绍。对应的表都是oracle安装时自带的表。

操作步骤: • 声明游标 • 打开游标 • 取出结果,此时的结果取出的是一行数据 • 关闭游标


到底那种类型可以把一行的数据都装进来

• 此时使用ROWTYPE类型,此类型表示可以把一行的数据都装进来。

如:例如:查询雇员编号为7369的信息(肯定是一行信息)。

declare
  eno emp.empno%type;
  empinfo emp%rowtype;
  begin
    eno:=&en;
    select * into empinfo from emp where empno=eno;
    dbms_output.put_line('no:'||empinfo.empno);
    dbms_output.put_line('name:'||empinfo.ename);
  end;
/

--使用for循环操作游标(比较常用)
declare
  cursor mycur1 is select * from emp ;
  empinfo emp%rowtype;
  cou number;
  begin
    for empinfo in mycur1 loop
      cou:=mycur1%rowcount;  -- 序号
      dbms_output.put_line(cou);
      dbms_output.put_line('no:'||empinfo.empno);
      dbms_output.put_line('name:'||empinfo.ename); 
    end loop;
  end;
/

--再看例子

一次性上涨全部雇员的工资。根据它所在的部门涨工资,规则:

• 10部门上涨10%

• 20部门上涨20%

• 30部门上涨30%

所有部门的上涨工资,最不能超过5000,如果超过5000,则工资就为5000。

declare
  cursor mycur2 is select * from emp;
  empinfo emp%rowtype;
  s emp.sal%type;
  begin
    for empinfo in mycur2 loop
      if empinfo.deptno=10 then
        s:=empinfo.sal*1.1;
      elsif empinfo.deptno=20 then
        s:=empinfo.sal*1.2;
      elsif empinfo.deptno=30 then
        s:=empinfo.sal*1.3;
      end if;
      if s>5000 then
        s:=5000;
      end if;
      update emp set sal=s where empno=empinfo.empno;
    end loop;
  end;
/

--函数就是一个有返回值的过程。

--定义一个函数:此函数可以根据雇员的编号查询出雇员的年薪
create or replace function myfun1(eno emp.empno%type) return number
as
  rsal number;
  begin
    select (sal+nvl(comm,0))*12 into rsal from emp where empno=eno;
    return rsal;
  end;
/

直接写SQL语句,调用此函数:
select myfun1(7369) from dual;

猜你喜欢

转载自zhanshi258.iteye.com/blog/1583888