存储过程(转)

2019-05-18  本文已影响0人  屎倒淋头还嚼便

出自: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循环语句

上一篇下一篇

猜你喜欢

热点阅读