MySQL基础(5) | 存储过程
一、基础
- 结束符【重要】
mysql的命令行执行每一条命令是以分号结尾的,也就是说识别是否为一条命令,是根据分号决定的。
然而存储过程中设计多条语句,很可能出现多个分号,所以直接把存储过程复制到命令执行一般都会失败。
解决方法是临时切换分隔符,让命令行知道整个存储过程的代码是完整的一块代码,如下:
DELIMITER $$
BEGIN
select * from table_name;
END$$
- 声明存储过程
CREATE PROCEDURE demo_in_parameter(IN p_in int)
- 存储过程开始和结束符号
BEGIN .... END
- 变量赋值【注:使用Set可以直接创建并赋值一个变量,该变量要用@开头】
SET @p_in=1;
SELECT 'Hello World' into @x;
- 变量定义【注:DECLARE定义的变量,开头不能加@,也是比较坑】
DECLARE l_int int unsigned default 4000000;
- 存储过程的参数
MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT
CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])
- IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
- OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
- INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
- 注释
#注释方式一
-- 注释方式二【注意有空格】
/*
注释方式三【可以注释多行】
*/
二、进阶
1). 条件语句
- if---then---else---end if 语句
delimiter $$
create PROCEDURE proc(aa int)
begin
declare sum int;
set sum = 100;
if aa > 0 then
set sum = sum - aa;
else
set sum = sum + aa;
end if;
select sum;
end$$
- case---when---then---else---end case语句
delimiter //
CREATE PROCEDURE proc2 ( aa INT ) BEGIN
DECLARE sum INT;
SET sum = 100;
CASE aa
WHEN 0 THEN
SET sum = sum + 10;
WHEN 1 THEN
SET sum = sum + 11;
ELSE
SET sum = sum + 12;
END CASE;
SELECT sum;
END //
2). 循环语句
- while---do---end while语句
delimiter //
CREATE PROCEDURE proc3(a int)
BEGIN
set @result = a;
WHILE a > 0 DO
set @result = @result + a;
set a = a - 1;
END WHILE;
select @result;
END //
call proc3(100)
- repeat---until 结束条件 end repeat;
delimiter //
CREATE PROCEDURE proc4(aa int)
BEGIN
declare result int;
set result = 0;
REPEAT
set result = result + aa;
set aa = aa - 1;
UNTIL aa <= 0 END REPEAT;
SELECT result;
END //
CALL proc4(3)
- loop语句
label: LOOP
statement_list
IF exit_condition THEN
LEAVE label;
END IF;
END LOOP label;
delimiter //
CREATE PROCEDURE proc5(aa int)
BEGIN
declare result int;
set result = 0;
label: LOOP
set result = result + aa;
set aa = aa - 1;
IF aa <= 0 THEN
LEAVE label;
END IF;
END LOOP label;
SELECT result;
END //
- iterate迭代【复合】
delimiter //
CREATE PROCEDURE proc6(aa int, out result int)
BEGIN
set result = 0;
label: LOOP
#如果aa是偶数,则跳过
if aa % 2 = 0 then
set aa = aa - 1;
ITERATE label;
end if;
set result = result + aa;
set aa = aa - 1;
IF aa <= 0 THEN
LEAVE label;
END IF;
END LOOP label;
SELECT result;
END //
call proc6(3, @result);
SELECT @result;