MySQL存储过程

——MySQL存储过程
1、MySQL执行语句过程:SQL语句—>MySQL引擎—>语法分析—>编译为可识别命令—>执行命令—>输出返回值—>客户端
2、存储过程是一种预编译,将结果存储在内存中,只有在第一次时会分析和执行,在之后直接调用相应的结果即可,效率更快,并且可以返回多个值
3、存储过程的优点:
(1)增强了SQL语句的功能和灵活性
(2)实现较快的执行速度
(3)减少网络流量
4、创建不带参数的存储过程:
create procedure sp1() select version();
call sp1;调用存储过程(不带参数)
call sp1();调用存储过程(不带参数)
+------------+
| version() |
+------------+
| 5.6.47-log |
+------------+
5、创建带有in类型参数的存储过程,不没有返回过程:
create procedure removeuserbyid(in id int unsigned)
-> begin
-> delete from user where id=id;注意id传入参数和表中字段不能相同,不然将删除所有记录,而非本来id记录
-> end
-> //
以上方式不正确,下面是正确方式
delimiter //
create procedure remove(in id1 int unsigned)
-> begin
-> delete from test1 where id=id1;
-> end
-> //
call remove(2) 删除id为2的记录
6、创建带有in和out的存储过程,带返回变量,其中返回变量可以使用用@num可以表示
delimiter //
create procedure remove1(in pid int unsigned,out usernum int unsigned)
-> begin
-> delete from test1 where id =pid;
-> select count(id) from test1 into usernum;
-> end
-> //
删除id记录之后,返回剩余数据表记录总数
call remove1(2,@nums)//
select @nums
7、begin end 之间的变量属于局部变量,而set @i=7称之为用户变量
8、select row_count();是指输出影响的记录数
9、创建多个out参数的存储过程
delimi//
create procedure remove2(in age1 smallint unsigned ,out deletenum smallint unsigned ,out usercounts smallint unsigned)
-> begin
-> delete from test1 where age=age1;
-> select row_count() into deletenum;
-> select count(id) from test1 into usercounts;
-> end
-> //
call remove2(22,@i,@j)// 调用存储过程
select @i,@j// 输出多个out返回值
10、存储过程和自定义函数的区别
(1)存储过程功能更加复杂一些,而函数针对性更强
(2)存储过程可以返回多个值,而函数只可以有一个返回值
(3)存储过程一般独立来执行,而函数可以作为其他SQL语句组成部分来出现
11、存储过程修改不了过程体,如要修改,则先删除再重新创建

原文地址:https://www.cnblogs.com/Yanjy-OnlyOne/p/12628599.html