oralce中存储过程
oralce中存储过程【荐】
在oracle中自定义存储过程处理业务关系,完成1个活n个较为复杂的业务功能
例如:银行转账业务
1.创建存储过程语法
create procedure 自定义存储过程名称(
参数名[in/out/in out] 参数类型
...
参数名[in/out/in out] 参数类型
)
as
...声明区...
begin
...编辑区...
end;
单词:procedure 过程
练习:定义存储过程完成部门注册
drop procedure pro_sacedept;
create procedure pro_sacedept(
v_no dept.deptNO%type,
v_name dept.dName%type
v_loc dept.loc%type
)
as
begin
insert into dept(deptNO,dename,loc)values(v_no,v_name,v_loc);
commit;
end;
/
调用方式1:
begin
pro_savedept(70,'墩部','伦敦');
end;
调用方式2:
exec pro_savedept(71,'卢部','战斗');
2.存储过程相关参数修饰符:in,out,in out
in 表示此参数是输入参数,只进不出(此修饰符修饰的参数,值在过程内不可二次变,只能通过调用时的实参赋值)
out 表示此参数是输出参数,可进可出(值可改变,并且会同期改变调用时传递的变量值)
练习对In修饰符号的错误赋值演示:
drop procedure pro01;
create procedure pro01(
v_a in number
)
as
begin
v_a:=666;
end;
/
警告: 创建的过程带有编译错误。
此时过程创建具有编译错误,因为v_a这个参数用in修饰过,值不可改变。
-----------------------------------------------------------------
练习in参数的正确赋值传递
drop procedure pro02;
create procedure pro02(
v_a in number
)
as
begin
dbms_output.put_line('过程内a的值是:'||v_a);
end;
/
可调用时赋值:
exec pro02(10);
-----------------------------------------------------------------
练习out参数的正确传递
drop procedure pro03;
create procedure pro03(
v_a out number,
v_b out number
)
as
begin
v_a:=1+2;
v_b:=1-2;
end;
/
out参数的实参传值
declare
v_x number;
v_y number;
begin
pro03(v_x,v_y);
dbms_output.put_line('x值:'||v_x);
dbms_output.put_line('y值:'||v_y);
end;
练习,2个数找最大值
drop procedure pro04;
create procedure pro04(
v_a in number,
v_b in number,
v_max out number,
v_sum out number
)
as
begin
if v_a>=v_b then
v_max:=v_a;
else
v_max:=v_b;
end if;
v_sum:=v_a+v_b;
end;
调用过程找出v_x和v_y中的最大值
declare
v_x number:=10;
v_y number:=20;
v_max1 number:=0;
v_sum1 number:=0;
begin
pro04(v_x,v_y,v_max1,v_sum1);
dbms_output.put_line(v_x||'与'||v_y||'中最大值是:'||v_max1);
dbms_output.put_line(v_x||'与'||v_y||'相加和是:'||v_sum1);
end;
练习存储过程完成转账业务
/*利用存储过程实现转账:貂蝉转张飞1000块钱...*/
insert into emp(empNo,eName,sal) values(2001,'张飞',800);
insert into emp(empNo,ename,sal) values(2002,'貂蝉',1888);
commit;
drop procedure proSal;
create procedure proSal(
v_nameFrom emp.ename%type,
v_nameTo emp.ename%type,
v_money emp.sal%type
)
as
v_sal emp.sal%type;
begin
select sal into v_sal from emp where eName=v_nameFrom;
if v_sal > v_money then
update emp set sal=sal-v_money where ename=v_nameFrom;
update emp set sal=sal+v_money where ename=v_nameTo;
commit;
dbms_output.put_line(v_nameFrom||'向'||v_nameTo||'转账成功!');
else
dbms_output.put_line(v_nameFrom||'余额不足,向'||v_nameTo||'转账失败!');
end if;
end;
exec proSal('貂蝉','张飞',1000);