MySQL 存储过程基础

存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。 简而言之,就是一次调用,可以实现多个sql语句,而且带有逻辑性。

复制

DELIMITER  $$

#生成一个随机的字符串,n代表位数
create function rand_string(n int) returns varchar(255)
begin
    declare chars_str varchar(100) default 'abcdefghijklmnopqrstuvwyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    declare return_str varchar(255) default '';
    declare i int default 0 ;
    while i< n do
        set     return_str=concat(return_str,substring(chars_str,floor(1+rand()*52),1));
        set i = i +1 ;
    end while ;
    return return_str ;
end$$

#生成一个随机的数字
create function rand_num() returns int(5)
begin
    declare i int default 0 ;
    set i = floor(100+rand()*10);
    return i ;
end$$

#创建插入数据的存储过程
crate procedure insert_emp(IN start int(10),IN max_num int(10))
begin
    declare i int default 0 ;
    set autocommit = 0 ;
    repeat
        set i = i +1 ;
        insert into emp(name,age) values(rand_string(6),(start+i));
        until i = max_num
    end repeat;
    commit;
end$$

call insert_emp(100,5000000);

定义结束符号

DELIMITER $$
或
DELIMITER //

默认情况下,delimiter “;” 用于向 MySQL 提交查询语句。在存储过程中每个 SQL 语句的结尾都有个 “;”,如果这时候,每逢 “;” 就向 MySQL 提交的话,当然会出问题了。

声明过程或函数

create procedure 存储过程名(参数)

create function 存储函数名(参数)

过程中可以应用多个函数。可以将过程视为开始和结束一个完成流程,而函数则是其中一个组成元素。

调用

call 存储过程名(参数)

过程和函数中的语句

参数

CREATE PROCEDURE one_name(in param1 int, in param2 varchar(10), ...)

  • IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)

  • OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)

  • INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

结构体

以begin开始,以end结束(可嵌套)

定义变量

DECLARE variable_name datatype [DEFAULT value];

定义赋值

SET 变量名 = 表达式值

变量作用域

最近的一个BEGIN_END结构体内。

逻辑语句

  • if-then-else-end if 语句

  • case-when-end cash语句:

  • while do ···· end while

  • repeat… until···· end repeat

  • loop ·····endloop

  • LABLES 标号 标号可以用在 begin repeat while 或者 loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。

  • ITERATE迭代