每个存储的程序都包含一个由SQL语句组成的主体。该语句可以是由分号(;)字符分隔的多个语句组成的复合语句。例如,下面的存储过程有一个包含SET语句的BEGIN … END块和包含另一个SET语句的REPEAT循环:

  1. delimter $$ --重新定义结尾标识符
  2. CREATE PROCEDURE dorepeat(p1 INT)
  3. BEGIN
  4. SET @x = 0;
  5. REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
  6. END $$
  7. delimter ; --重新定义回;

这样就创建了dorepeat()一个存储程序

  1. call dorepeat(1000); --调用存储过程
  2. select @x;
  3. drop procedure dorepeat;

image.png

  1. show procedure status where db='db_users';

声明变量

  1. delimiter $$
  2. create procedure test()
  3. begin
  4. declare total_sale varchar(20) default '';
  5. declare x,y int default 0;
  6. declare avgres double default 0;
  7. set x = 4;
  8. set y = 5;
  9. select avg(salary) into avgres from employess; #重新赋值
  10. end $$

传入参数


传入一个name获取到这个name在数据库中的其它所有信息

  1. alter table employees change name ename varchar(30);
  2. delimiter $$
  3. create procedure getName(in name varchar(50))
  4. begin
  5. select * from employees where ename = name;
  6. end$$
  7. delimiter ;
  8. call getName('李白');

image.png

传出参数


传入名字,可以输出他的薪资

  1. delimiter $$
  2. create procedure getSarlary(in name varchar(30),out sarlary double)
  3. begin
  4. select salary into sarlary from employees where ename = name;
  5. end$$
  6. delimter ;
  7. call getSarlary('妲己',@s);
  8. select @s;

image.png

自定义函数


根据给定的数字,随机生成对应长度的字符串

  1. delimiter $$
  2. create function rand_str(n int) returns varchar(255)
  3. begin
  4. declare str varchar(255) default 'abcedefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  5. declare i int default 0;
  6. declare res_str varchar(255) default '';
  7. while i < n do
  8. set res_str = concat(res_str,substring(str,ceil(rand()*52),1));
  9. set i = i + 1;
  10. end while;
  11. return res_str;
  12. end$$
  13. delimiter ;
  14. select rand_str(5);