存储过程\函数的使用
存储过程就是提前已经编译好的一段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