欢迎光临散文网 会员登陆 & 注册

oralce中存储过程

2023-03-09 10:50 作者:阿彦绝地反击  | 我要投稿

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);


oralce中存储过程的评论 (共 条)

分享到微博请遵守国家法律