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