文档:https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html
1)create procedure用来创建存储过程,create function用来创建函数
2)函数与存储过程最大的区别就是函数调用有返回值,调用存储过程用call语句,而调用函数就直接引用函数名+参数即可
3)Definer和sql security子句指定安全环境
Definder是MySQL的特殊的访问控制手段,当数据库当前没有这个用户权限时,执行存储过程可能会报错
sql secuirty的值决定了调用存储过程的方式,取值 :definer(默认)或者invoker
4)IN,OUT,INOUT三个参数前的关键词只适用于存储过程,对函数而言所有的参数默认都是输入参数
5)Rontine_body子句可以包含一个简单的SQL语句,也可以包含多个SQL语句,通过begin…end将这多个SQL语句包含在一起,MySQL存储过程和函数中也可以包含类似create和drop等DDL语句
6)Comment子句用来写入对存储过程和函数的注释
7)Language子句用来表示此存储过程和函数的创建语言
8)存储过程和函数被标注为deterministic表明当输入相同的参数是会返回相同的结果,反之如果是not deterministic则表示相同参数不会是相同结果,默认是not deterministic
#创建简单的存储过程: #Delimiter命令是改变语句的结束符,MySQL默认的结束符为;号,由于procedure和function中的;号并不代表创建的结束,所以要替换成另外的结束符以便表示创建的结 delimiter // create procedure simpleproc(in param1 int,out param2 int) begin select count(*) into param2 from Students where sid>param1; end // delimiter ; #调用存储过程: call simpleproc(1,@a); select @a;
#创建简单的函数过程: delimiter // create function hello(s char(20)) returns char(50) return concat(‘hello ‘,s); // delimiter ; #调用 mysql> select hello(‘zhangsan‘); +-------------------+ | hello(‘zhangsan‘) | +-------------------+ | hellozhangsan | +-------------------+ #---------------------------------------- delimiter // create function simplefunc(param1 int) returns int begin update Students set gender=1 where sid=param1; select count(*) into @a from Students where sid>param1; return @a; end; // delimiter ;
原文:https://www.cnblogs.com/hujinzhong/p/11629772.html