存储过程\函数的使用


  存储过程就是提前已经编译好的一段PL/SQL语言,放置在数据库可以直接被调用。

  这一段PL/SQL一般都是固定步骤的业务。

  存储过程语法:

    create[ or replace] PROCEDURE 过程名[(参数名 in/out 数据类型)]

    AS  ----(或者IS)

        ----(相当于declare)

     begin

      PLSQL子程序体;

    end;

---给指定员工涨100快钱

create or replace procedure p1(eno emp.empno%type)
is
begin
  update emp set sal=sal+100 where empno=eno;
  commit;
end;

---测试p1

declare
begin
  p1(7788);--调用存储过程p1
end;

---通过存储函数计算指定员工的年薪

create or replace function f_yearsal(eno emp.empno%type) return number
is
  s number(10);
begin
  select sal*12+nvl(comm,0) into s from emp where empno = eno;
  return s;
end;

---测试f_yearsal

---存储函数在调用的时候返回值需要接收。

declare
  s number(10);
begin
  s := f_yearsal(7788);--调用存储过程p1
  dbms_output.put_line(s);
end;

---out类型参数如何使用
---使用存储过程算年薪

create or replace procedure p_yearsal(eno emp.empno%type,yearsal out number)
is
  s number(10);
  c emp.comm%type;
begin
  select sal*12,nvl(comm,0) into s,c from emp where empno = eno;
  yearsal := s+c;
end;

---测试p_yearsal

declare
  yearsal number(10);
begin
  p_yearsal(7788,yearsal);
  dbms_output.put_line(yearsal);
end;

--in和out类型参数的区别是什么?
--凡是涉及到into查询语句赋值或者:=赋值操作的参数,都必须使用out来修饰,否则都是in。

存储函数与过程的区别:

1.语法区别:关键字不一样;存储函数比过程多两个return。

2.本质不同:存储函数有返回值,存储过程没有。

存储过程想实现有返回值的业务,就必须使用out类型参数,但其本质也不是真的有了返回值,而是在存储过程内部给out类型参数赋值,再执行完毕后直接拿到输出类型参数的值。

 --案例需求:查询员工姓名,员工所在部门名称

--案例准备工作:把scott用户下的dept表复制到当前用户下。

create table dept
as select * from scott.dept;
select * from dept;

--传统方式实现

select ename,dname from emp e,dept d
where e.deptno = d.deptno

--使用存储函数实现提供一个部门编号,输出一个部门名称

create or replace function f_printdept(dno dept.deptno%type) return dept.dname%type
is
  dename dept.dname%type;
begin
  select dname into dename from dept where deptno = dno;
  return dename;
end;

--使用f_printdept实现案例需求:查询员工姓名,员工所在部门名称

select e.ename,f_printdept(e.deptno) 
from emp e