一. 存储过程
-
什么是存储过程
简单点说:就是封装了一组sql语句 ,提前编译好,存储在服务端
效率高,安全 -
使用场景:
网上买了一件商品:商品表(update),订单表(insert),购物车(delete), 金额表(update),物流表(insert),日志表(insert) -
语法
create [or replace] procedure 过程名(参数名 输入型 in |输出型 out 数据类型 ,…)
as | is
– 声明变量
beginend;
-
栗子: 给某员工涨工资(打印涨前,涨后的工资)
create or replace procedure updateSal(eno in number ,money in number)
as
oldSal number;
newSal number;
begin
select sal into oldSal from emp where empno = eno;
dbms_output.put_line(‘涨前的工资:’ || oldSal);update emp set sal = sal + money where empno = eno; commit; -- 命令提交 select sal into newSal from emp where empno = eno; dbms_output.put_line('涨后的工资:' || newSal);
end;
– 访问存储过程 – 只有输入参数
call updateSal(7788, -100);
4. 栗子:有输入参数有输出参数
获取某员工的年薪
– 输入参数:某员工 输出参数:员工的年薪
create or replace procedure getYearSal(eno in number ,yearsal out number)
is
begin
select sal * 12 + nvl(comm,0) into yearsal from emp where empno = eno;
end;
– 访问存储过程:有输入输出参数
declare
nianxin number;
begin
getYearSal(7788, nianxin);
dbms_output.put_line(nianxin);
end;
5. 栗子:有输入输出参数(游标)
cursor:静态的游标,在声明时,必须指定SQL语句;
sys_refcursor: 动态的游标,在声明时候不需要指定sql语句,什么时候用,什么是指定
– 获取某部门的所有的员工信息
– 输入型:某部门 输出型: 员工信息(多行)
create or replace procedure getEmpsByDeptno(dno in number ,emps out sys_refcursor)
as
begin
– 给动态的游标指定sql语句
open emps for
select * from emp where deptno = dno;
end;
– 访问存储过程
declare
emps sys_refcursor;
e_row emp%rowtype;
begin
getEmpsByDeptno(10,emps );
– 遍历
loop
–提取内容
fetch emps into e_row;
exit when emps%notfound;
dbms_output.put_line(e_row.empno||e_row.ename||e_row.job);
end loop;
close emps;
end;