每个存储的程序都包含一个由SQL语句组成的主体。该语句可以是由分号(;)字符分隔的多个语句组成的复合语句。例如,下面的存储过程有一个包含SET语句的BEGIN … END块和包含另一个SET语句的REPEAT循环:
delimter $$ --重新定义结尾标识符
CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
SET @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()
begin
declare 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))
begin
select * from employees where ename = name;
end$$
delimiter ;
call getName('李白');
传出参数
传入名字,可以输出他的薪资
delimiter $$
create procedure getSarlary(in name varchar(30),out sarlary double)
begin
select 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)
begin
declare str varchar(255) default 'abcedefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
declare i int default 0;
declare res_str varchar(255) default '';
while i < n do
set 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);