每个存储的程序都包含一个由SQL语句组成的主体。该语句可以是由分号(;)字符分隔的多个语句组成的复合语句。例如,下面的存储过程有一个包含SET语句的BEGIN … END块和包含另一个SET语句的REPEAT循环:
delimter $$ --重新定义结尾标识符CREATE PROCEDURE dorepeat(p1 INT)BEGINSET @x = 0;REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;END $$delimter ; --重新定义回;
这样就创建了dorepeat()一个存储程序
call dorepeat(1000); --调用存储过程select @x;drop procedure dorepeat;

show procedure status where db='db_users';
声明变量
delimiter $$create procedure test()begindeclare total_sale varchar(20) default '';declare x,y int default 0;declare avgres double default 0;set x = 4;set y = 5;select avg(salary) into avgres from employess; #重新赋值end $$
传入参数
传入一个name获取到这个name在数据库中的其它所有信息
alter table employees change name ename varchar(30);delimiter $$create procedure getName(in name varchar(50))beginselect * from employees where ename = name;end$$delimiter ;call getName('李白');
传出参数
传入名字,可以输出他的薪资
delimiter $$create procedure getSarlary(in name varchar(30),out sarlary double)beginselect salary into sarlary from employees where ename = name;end$$delimter ;call getSarlary('妲己',@s);select @s;
自定义函数
根据给定的数字,随机生成对应长度的字符串
delimiter $$create function rand_str(n int) returns varchar(255)begindeclare str varchar(255) default 'abcedefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';declare i int default 0;declare res_str varchar(255) default '';while i < n doset res_str = concat(res_str,substring(str,ceil(rand()*52),1));set i = i + 1;end while;return res_str;end$$delimiter ;select rand_str(5);
