函数语法
--创建函数,参数是部门名称,返回值 是该部门平均薪资 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;