1.存储过程
存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
2.MySQL存储过程创建
1.语法
#创建存储过程
CREATE PROCEDURE 存储过程名 ([[IN|OUT|INOUT]] 参数名 数据类型) 过程体;
#删除存储过程
DROP PROCEDURE IF EXISTS 存储过程名;
#删除存储过程
DROP PROCEDURE IF EXISTS adduser;
#创建存储过程
CREATE PROCEDURE adduser(num DOUBLE)
BEGIN
UPDATE `user` SET money = money - num WHERE name = '张三';
UPDATE `user` SET money = money + num WHERE name = '李四';
END;
2.过程体
BEGIN
过程体
END;
过程体每条SQL语句用';'隔开
3.参数
IN:
不管存储过程里面的参数怎么改变,都不影响外部变量。
OUT:
不管参数传入之前的定义是什么,在存储过程中都为null。
存储过程里面对参数的改变,都会影响外部变量。
INOUT:
参数在外部定义后,会将定义的变量传入。
存储过程里面对参数改变,都会影响外部的变量。
#IN0
CREATE PROCEDURE add2(IN num INT(20))
BEGIN
SET num = 111;
SELECT num;
END;
SET @a = 123;
CALL add2(@a);
SELECT @a;
#OUT
CREATE PROCEDURE add3(OUT num INT(20))
BEGIN
SELECT num;
SET num = 111;
END;
SET @a = 123;
CALL add3(@a);
SELECT @a;
#INOUT
CREATE PROCEDURE add3(INOUT num INT(20))
BEGIN
SELECT num;
SET num = 111;
SELECT num;
END;
SET @a = 123;
CALL add3(@a);
SELECT @a;
4.变量
使用 DECLARE 定义变量(只能在存储过程、函数或触发器中使用)。
变量赋值:
1.使用 DEFAULT 默认赋值。
2.使用 SET 赋值。
3.使用 SELECT...INTO... 赋值。
DROP PROCEDURE IF EXISTS add1;
CREATE PROCEDURE add1()
BEGIN
#默认值
DECLARE a INT(20) DEFAULT 1;
DECLARE b INT(20);
DECLARE c VARCHAR(255);
#使用set为变量赋值
SET b = 2;
SELECT a;
SELECT b;
#使用SELECT...INTO...为变量赋值
SELECT name INTO c FROM user WHERE id = 1;
SELECT c;
END;
CALL add1();
用户变量:
用于在 SQL 语句和存储过程之间传递数据。
用法:
@变量名
在使用用户变量之前,最好先初始化它,否则它的值将是 null。
变量作用域:
内部变量在其作用域范围内享有更高的优先权,当执行到end时,内部变量消失,不再可见了,在存储过程外再也找不到这个内部变量,但是可以通过out参数或者将其值指派给会话变量来保存其值。
5.调用存储过程
CALL 存储过程名;
6.分隔符
MySQL默认以";"为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错。所以要事先用 "DELIMITER //" 声明当前段分隔符,让编译器把两个 "//" 之间的内容当做存储过程的代码,不会执行这些代码。"DELIMITER ;" 的意为把分隔符还原。
3.MySQL存储过程的控制语句
1.条件语句
IF-THEN-ELSE语句:
IF 条件 THEN
SQL语句;
END IF;
CREATE PROCEDURE methods()
BEGIN
DECLARE a INT;
SET a = 1;
IF a = 1 THEN
SELECT a;
END IF;
END;
CALL methods();
CASE-WHEN-THEN-ELSE语句:
CASE 变量名
WHEN 值1 THEN
SQL语句;
WHEN 值2 THEN
SQL语句;
ELSE
SQL语句;
END CASE;
CREATE PROCEDURE methods()
BEGIN
DECLARE a INT;
SET a = 1;
CASE a
WHEN 0 THEN
SELECT '0',a;
WHEN 1 THEN
SELECT '1',a;
ELSE
SELECT '---',a;
END CASE;
END;
CALL methods();
2.循环语句
WHILE-DO...END-WHILE语句:
WHILE 条件 DO
SQL语句;
END WHILE;
CREATE PROCEDURE methods()
BEGIN
DECLARE a INT DEFAULT 0;
WHILE a<5 DO
INSERT INTO user (name,money) VALUES ('李明',1000);
SET a=a+1;
END WHILE;
END;
CALL methods();