MySQL基础(5) | 存储过程

MySQL基础(5) | 存储过程


一、基础

  1. 结束符【重要】

mysql的命令行执行每一条命令是以分号结尾的,也就是说识别是否为一条命令,是根据分号决定的。

然而存储过程中设计多条语句,很可能出现多个分号,所以直接把存储过程复制到命令执行一般都会失败。

解决方法是临时切换分隔符,让命令行知道整个存储过程的代码是完整的一块代码,如下:

DELIMITER $$
BEGIN
	select * from table_name;
END$$
  1. 声明存储过程
CREATE PROCEDURE demo_in_parameter(IN p_in int)    
  1. 存储过程开始和结束符号
BEGIN .... END  
  1. 变量赋值【注:使用Set可以直接创建并赋值一个变量,该变量要用@开头】
SET @p_in=1;
SELECT 'Hello World' into @x;
  1. 变量定义【注:DECLARE定义的变量,开头不能加@,也是比较坑】
DECLARE l_int int unsigned default 4000000; 
  1. 存储过程的参数

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT

CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])
  • IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
  • OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
  • INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
  1. 注释
#注释方式一
-- 注释方式二【注意有空格】
/*
	注释方式三【可以注释多行】
*/

二、进阶

1). 条件语句

  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$$
  1. 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). 循环语句

  1. 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)
  1. 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)
  1. 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 //
  1. 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;
原文地址:https://www.cnblogs.com/iwsx/p/12348957.html