5:函数,游标

函数语法

--创建函数,参数是部门名称,返回值 是该部门平均薪资
create or replace function fun_avgsal
(
  dno number
)
return number -- 返回值类型
is
begin
  
  declare
  v_avgsal emp.sal%type;
  begin
  select sal into v_avgsal 
  from emp where emp.empno = dno;
  return(v_avgsal);
  end;
end;

调用:

--调用
declare
  avgsal emp.sal%type;
  begin
    avgsal := fun_avgsal(30);
    dbms_output.put_line(avgsal);
end;

 

游标:一个存储上下文信息的对象,理解为‘集合’

隐式游标:

--使用隐式游标
--更新7788的薪资
begin 
  update emp set sal = sal +100 where empno = 7788;
  
  --使用隐式游标
  --怎么知道上方语句是否被执行,根据的是数据库更新条数
  --存储的是刚刚执行的sql语句
  if SQL%FOUND then
    dbms_output.put_line('更新成功');
    commit;
  else
    dbms_output.put_line('更新失败');
    rollback;
  end if;    
end;

显示游标:语法

--显示游标的使用
--声明游标,提取7788的人的名字和职务
declare
  v_name emp.ename%type;
  v_job emp.job%type;
  cursor emp_cur --1:声明游标
  is
  select ename,job from emp where emp.empno = 7788;
begin
  --在执行部分使用游标
  --2:打开游标
   open emp_cur;
   --3:提取游标的值
   fetch emp_cur into v_name,v_job;
   dbms_output.put_line(v_name || v_job);
   --4:关闭游标
   close emp_cur;
end;

存放多条数据

--声明游标存放多条数据,遍历取出数据
declare 
cursor emp_cursor
is
select * from emp where emp.deptno = 20;
begin
  --for循环不需要手动打开游标,自动打开
  for emps in emp_cursor loop
  dbms_output.put_line(emps.empno ||','||emps.ename);
  end loop;
end;
--另一种循环写
declare
emps emp%rowtype;
cursor emp_cur
is
select * from emp where emp.deptno = 20;
begin
  open emp_cur;
  loop
  fetch emp_cur into emps;
  exit when emp_cur%notfound;
  dbms_output.put_line(emps.empno ||','||emps.ename);
  end loop;
end;

带参游标

--带参游标
declare
v_name emp.ename%type;
v_sal emp.sal%type; 
cursor emp_cur(eno number)
is
select ename,sal from emp
where emp.empno = eno;
begin
  open emp_cur(7788);
  fetch emp_cur into v_name,v_sal;
  dbms_output.put_line(v_name||','||v_sal);
  close emp_cur;
end;

 

posted @ 2018-04-24 16:36  心高心低  阅读(252)  评论(0编辑  收藏  举报