存储过程(转)
出自:https://www.cnblogs.com/mark-chan/p/5384139.html
// 具体例子
DELIMITER //
DROP PROCEDURE IF EXISTS demo;
CREATE PROCEDURE demo()
BEGIN
DECLARE n int DEFAULT 0;
WHILE(n<20000) DO
INSERT INTO t_user(name) VALUES(substring(MD5(RAND()),floor(RAND()*26)+1,6));
set n = n + 1;
END WHILE ;
END //
DELIMITER ;
call demo();
DELIMITER;
DROP PROCEDURE IF EXISTS demo;
CREATE PROCEDURE demo()
BEGIN
DECLARE n int DEFAULT 0;
WHILE(n<3) DO
INSERT INTO liuyan(liuyan) VALUES(substring(MD5(RAND()),floor(RAND()*26)+1,6));
set n = n + 1;
END WHILE ;
END;
DELIMITER ;
call demo();
上面是在查询中执行的语句,语句中新建了一个存储过程demo,并且说如果demo已经存在就删除调(如果已有demo,会删除,并重新创建。如果没有demo,就新建一个存储过程demo)
下面是新建函数,是一个存储过程,可以保存为demo,存储过程的名称为demo,存储过程demo可以在ssm框架中调用。
BEGIN
DECLARE n int DEFAULT 0;
WHILE(n<200) DO
INSERT INTO user(userId,userName) VALUES(500 + RAND() * (1000 - 500),substring(MD5(RAND()),floor(RAND()*26)+1,6));
set n = n + 1;
END WHILE ;
END
ssm调用存储过程时,存储过程支持事务。
事务回滚分隔符
MySQL默认以";"为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个"//"之间的内容当做存储过程的代码,不会执行这些代码;“DELIMITER ;”的意为把分隔符还原。
参数
存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开。MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:
IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT:该值可在存储过程内部被改变,并可返回
INOUT:调用时指定,并且可被改变和返回
DELIMITER //
CREATE PROCEDURE out_param(OUT p_out int)
BEGIN
SELECT p_out;
SET p_out=2;
SELECT p_out;
END;
//
DELIMITER ;
#调用
SET @p_out=1;
CALL out_param(@p_out);
SELECT @p_out;
IN a int // 调用时,a可以赋值,但不能返回
OUT a int // 调用时,a无法赋值,但可以返回
INOUT a int // 调用时,a可以赋值,也可以返回
一、if - then - else语句
二、while循环语句