mysql存储过程total_mysql的总结7--存储过程

1.定义:存储过程是一组为了完成某个特定功能而编写的SQL程序集。

2.优点:

<1>.通过把处理封装在简单易用的单元中,简化复杂的操作。

<2>.提高性能。使用存储过程比使用单独的SQL语句要快。

<3>.安全。调用者只需要调用指定的存储过程即可,而不用关心存储过程的内容。(如转账)

3.缺点:

<1>.编写复杂。

<2>.如果没有相应的权限,你将无法创建存储过程。

4.

<1>.创建简单的存储过程:如返回用户的平均年龄

delimiter // (含义:用于临时将SQL语句的结束符更改为//;注意双斜杠前有空格啊)

create procedure ageAge() (存储过程的名称为:ageAge())

begin   (相当于 { )

select avg(age) as ageAge from t_user;

end // (相当于 })

delimiter ;  (存储过程结束,将SQL语句的结束符改回!注意分号前有空格啊!!)

<1.2>.存储过程的调用:call avgAge();

<2>.创建带有返回值参数的存储过程: 如获得用户的最大年龄,最小年龄,平均年龄

delimiter //

create procedure ageMVM(

out ma int,

out mi int,  (注意:out是返回值参数,ma,mi,av试试变量名称,decimal是一种数据类型)

out av decimal(8,2)  (8代表精度,2,代表小数的位数)

)

begin

select max(age) into ma from t_user;   (说明:into是将值赋给变量ma)

select min(age) into mi from t_user;

select avg(age) into av from t_user;

end //

delimiter ;

<2.1>.调用存储过程:两个语句同时使用:

call(@ma,@mi,@av);

select @ma,@mi,@av;

<3>.传入参数的存储过程:

eg1.根据用户名和密码,找到用户的地址。

delimiter //

create procedure getAddressById(

inun varchar(20),

inpd varchar(20),

outad varchar(20)

)

begin

select address into ad from t_user where username=un and password=pd;

end //

delimiter ;

<3.1>.调用该存储过程:

call ('tom','123456',@ad);

select @ad;

eg2.其实存储过程应该做 业务不是上面的,而是下面的常用的多,上面的知识一个例子!!

delimiter //

create procedure ordertotal(

in ordernum int,  (in代表传入的参数!! )

out total decimal(8,2)

)

begin

select sum(item.price * quality) into total from orderitems where order_num=ordernum;

end //

delimiter;

调用:call ordertotal(2005,@total);

select @total;

4.带有选择条件的存储过程:

delimiter //

create procedure ordertotaltax(

in ordernum int ,     (订单号)

in tax boolean ,  (是否需要缴税)

out total decimal(8,2)  (总金额,存储过程的返回值)

)

begin

declare ordertotal decimal(8,2);   (声明变量:总金额)

declare taxvalue float default 0.6;   (声明变量:税率)

(下面计算指定订单的单价)

select sum(item_price*quantity) into ordertotal from orderitems where order_num = ordernum;

(如果需要缴税)

if tax then

select ordertotal+(ordertotal*taxvalue) into ordertotal;

end if;

select ordertotal into total;  (将当前的总价复制给返回参数,into 也可以用set代替)

end //

delimiter ;

调用该存储过程:

(缴税时) : call ordertotaltax(2005,1,@total);  (1代表true)

(不交税): call ordertotaltax(2005,0,@total);   (0代表false)

5. 流程控制语句   if ---while

<1>.if的测试使用:

delimiter //

create procedure iftest(

out var int

)

begin

declare id int default 10;

if id=12 then

set var=0;

elseif id<12 then

set  var=1;

else

set var=2;

end if;

end //

delimiter ;

调用:call iftest(@var);

select @var;

<2>.while的测试使用:

delimiter //

create procedure whiletest()

begin

declare num int;

declare total int default 0;

set num=0;

while num<10 do   (do相当于{)

set total=total+num;

set num=num+1;

end while;

select total;    (打印总和的值)

end //

delimiter ;

调用该存储过程:call whiletest();

6.存储过程的删除:

如:删除上面的存储过程

drop procedure   whiletest;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个MySQL存储过程的案例: ```sql DROP PROCEDURE IF EXISTS getUserInfo; CREATE PROCEDURE getUserInfo(in date_day datetime) BEGIN declare _userName varchar(12); -- 用户名 declare _chinese int; -- 语文 declare _math int; -- 数学 declare done int; -- 定义游标 DECLARE rs_cursor CURSOR FOR SELECT username, chinese, math from userInfo where datediff(createDate, date_day) = 0; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 获取昨天的日期 if date_day is null then set date_day = date_add(now(), interval -1 day); end if; open rs_cursor; cursor_loop: loop FETCH rs_cursor into _userName, _chinese, _math; -- 取数据 if done = 1 then leave cursor_loop; end if; -- 更新表 update infoSum set total = _chinese + _math where UserName = _userName; end loop cursor_loop; close rs_cursor; END; ``` 这是一个存储过程名为getUserInfo的案例,参数为date_day,日期格式为2008-03-08。在该存储过程中,我们使用游标rs_cursor来查询userInfo表中与指定日期相差一天的记录。然后,我们通过一个循环来遍历游标获取的结果,并更新infoSum表中对应用户名的总分数。该存储过程使用了游标和循环结构来实现对数据的操作。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* *2* [mysql存储过程案例](https://blog.csdn.net/wind_602/article/details/89883323)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值