Mysql的存储过程完整讲解

1.介绍

存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,
经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数
(如果该存储过程带有参数)来调用执行它.

2.简单来说

就是保存一个sql语句代码,下次执行的时候,直接执行这个sql代码
也就相当于创建一个函数

3.教程

  • https://blog.csdn.net/qq_33157666/article/details/87877246
    ##2.实例
delimiter $$
create procedure report_dept( )//创建存储过程名字
reads sql data//这个存储过程只能执行读的操作
sql security invoker//设置所有具有权限的人,可以调用
begin
    SELECT DISTINCT department. dept_ _id, dept_ name , (Males+Females) as ps ,Males, Females
    FROM department LEFT JOIN
    (SELECT dept_ _id,count(*) as Males FROM employee WHERE gender= '男‘
    GROUP BY dept_ _id) AS em
    ON em. dept_ _id=department.dept_ id LEFT JOIN
    (SELECT dept_ id,count(*) as Females FROM employee  WHERE gender='女'
    GROUP BY dept_ id) AS ef
    ON em. dept_id=ef .dept_ _id
    ORDER BY department .dept_ id;
end;
$$

2.删除存储过程

drop procedure 名字

drop procedure report_dept

3.调用存储过程

call report_dept();

2-传参返回参

1.语法

in 代表接收调用者传的参数
out 代表返回给调用者的参数
numeric 实数新数据类型

delimiter $$
CREATE PROCEDURE t_order(接收还是返回的参数 变量名字1 变量类型,接收还是返回的参数 变量名字2 变量类型)
READS SQL DATA
SQL SECURITY INVOKER
begin
    select total_money from order  where order_id=oid into tm;//由于select查询只有一个结果,就可以使用into语句,把这个结果赋值但tm中
end;
$$
  • 实例
delimiter $$
CREATE PROCEDURE t_order(in oid int,out tm numeric(9,2))
READS SQL DATA
SQL SECURITY INVOKER
begin
    select total_money from order  where order_id=oid into tm;//由于select查询只有一个结果,就可以使用into语句,把这个结果赋值但tm中
end;
$$
  • 调用
call t_order(5, @t) ;//使用@符号接收参数
select @t;

2.返回多个参数

delimiter $$
CREATE PROCEDURE total_order(IN orderid INT , OUT totals NUMERIC(9,2), OUT cid INT)
READS SQL DATA
SQL SECURITY INVOKER
begin
	select total_money,customer_id 
	from orders 
	where order_id=orderid 
	into totals,cid;
	end
$$

3.注意事项

在存储过程当中,每个sql语句都要有结束符

delimiter $$
CREATE PROCEDURE 
register_user(in duser_name VARCHAR(11),in dpwd VARCHAR(32),in dreal_name VARCHAR(11),in did_num VARCHAR(18),in dphone_num VARCHAR(11),in demail VARCHAR(32),out msg VARCHAR(32))
SQL SECURITY INVOKER
begin
		DECLARE num VARCHAR(32) DEFAULT '';
		select count(*) into num 
		from `user`
		where `user`.user_name=duser_name 
					or dphone_num=`user`.phone_num 
					or did_num=`user`.id_num
					or demail=`user`.email ;
set msg=num;
		if (num='0')then
			INSERT into user(user_name,password,real_name,id_num,phone_num,email)VALUES(duser_name,dpwd,dreal_name,did_num,dphone_num,demail);
		end if;
end
$$

3-存储函数

1.介绍

存储函数和存储过程区别就是存储函数可以返回值

delimiter $$
CREATE function t_ order2(oid int)//存储函数中所有的都是in
returns numeric(9,2)//设置返回什么样的数据
READS SQL DATA
SQL SECURITY INVOKER
BEGIN
    select total_ money from
    orderi where order_id=oid into @t;//把查询结果放入零时变量里面
    return @t;//返回这个值
END;
$$

2.调用

set @a=t_order2(5);
select @a;

4-注意事项

1.mysql 编写存储过程传参,参数要给定大小 ,如 varchar 类型的,传参是

如下 格式:
CREATE PROCEDURE name( IN params VARCHAR(255) )
BEGIN
方法体
END

2. 参数的名字 尽量不要和 数据库表字段的名字一样,或者给表加一个别名

3 .最好是把传的参数,在方法体里声明接收,这样数据库就不会参数和表字段混用了

4.声明参数的3个方法 :

  • 设置全局变量
    set @a='一个新变量';

  • 在函数和储存过程中使用的变量declear
    declear a int unsigned default 1;

  • 这种变量需要设置变量类型 而且只存在在 begin…end 这段之内
    select .. into.. 直接将表内内容赋值到指定变量当中
    select name,bid into @a,@b from bank limit 1;

  • 要注意一点就是变量名不能和字段名一致
    ##6-声明变量

1.declare

  • 语法
    declare 变量名 变量类型
    declare id int

2.@

  • 零时变量
    @变量名
    @tem
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值