您现在的位置: 万盛学电脑网 >> 程序编程 >> 数据库 >> mysql教程 >> 正文

mysql存储过程与函数

作者:佚名    责任编辑:admin    更新时间:2022-06-22

   存储过程

  存储过程是一段代码,由存储在一个数据库的目录中、声明式的和过程式的sql语句组成,可以从一个程序、触发器或者另一个存储过程调用它从而激活它。

  每个存储过程包含至少3部分:一个参数列表、一个存储过程、一个名字。

  一个数据库中的存储过程的名字必须是唯一的,就像表的名字一样。

  一个参数列表可以有0个、1个或多个参数,通过这些参数,过程就可以和外界联系。

  存储过程支持3中参数类型:

  1、输入参数IN:数据可以传递到存储过程;

  2、输出参数OUT:数据可以由存储过程传到外界;

  3、输入输出参数INOUT:既可以充当输入参数,也可以充当输出参数。

  就像c语言函数一样,即使没有参数,过程名后面还是需要跟一对括号。

  存储过程以begin开始end结束,且之间还可以嵌套begin-end块。

  局部变量:

  declare 变量列表 变量类型 [default 默认值]

  存储过程不仅可以使用局部变量,还可以使用全局变量。

  默认值不仅限于直接量,还可以是符合表达式,也可以是标量子查询。

?

1 2 3 4 5 6 7 8 mysql> delimiter // mysql> create procedure test (in a integer)     -> begin     -> declare b integer default     -> (select count(*) from student );     -> end     -> // Query OK, 0 rows affected (0.42 sec)

  set语句

  set用于给一个变量赋值。如:

?

1 2 3 set a = 1; set a := 1; set a = 1,b := a;

  leave语句

  离开一个块(循环块或者语句块),类似于break;

  如下,进入begin后立即离开。

?

1 2 3 4 mysql> create procedure test (in a integer)     -> block : begin     -> leave block;     -> end//

  iterate语句

  进入一个循环。

  call语句

  调用存储过程。

  if-esle语句

  格式:

  if 条件 then 语句 ;

  elseif 条件 then 语句;

  esle 语句;

  end if

?

1 2 3 4 5 6 7 8 9 mysql> create procedure test (in a integer)     -> begin     -> declare b integer;     -> if a < 60 then set b = -1;     -> elseif a >60 then set b = 1;     -> else set b = 0;     -> end if;     -> end     -> //

  case语句

  格式:

  case

  when 条件 then 语句;

  when 条件 then 语句;

  else 语句;

  end case;

  while 语句

  格式:

  while 条件 do

  语句;

  end while;

?

1 2 3 4 5 6 7 mysql> create procedure test (in a integer)     -> begin     -> declare b integer default 1;     -> while b < a do     -> set b = b + 1;     -> end while;     -> end//

  repeat语句

  格式:

  repeat

  语句;

  until 条件 end repeat;

?

1 2 3 4 5 6 7 mysql> create procedure test (in a integer)     -> begin     -> declare b integer default 1;     -> repeat     -> set b = b + 1;     -> until b > a end repeat;     -> end//

  loop语句

  格式:

  loop

  if或case条件 leave loop;

  语句;

  end loop;

?

1 2 3 4 5 6 7 8 9 mysql> create procedure test (in a integer)     -> begin     -> declare b integer default 1;     -> loop_block: loop     -> if b > a then leave loop_block;     -> end if;     -> set b = b + 1;     -> end loop;     -> end//

  select into 语句

  用于将select的查询结果赋值给过程内的变量。

?

1 2 3 4 mysql> create procedure test (out b integer)     -> begin     -> select count(*) into b from student;     -> end//

  现在student内有4条数据,调用test如下:

?

1 2 3 4 5 6 7 8 mysql> set @b = 0// mysql> call test(@b)// mysql> select @b// +------+ | @b   | +------+ |    4 | +------+

  如果select语句查询的结果包含有多行,直接使用into赋值时不可行的。比如:

?

1 2 3 4 mysql> create procedure test (out b integer)     -> begin     -> select stu_id into b from student;     -> end//

  虽然语法正确,但是在调用时报错:

?

1 2 mysql> call test(@b)// ERROR 1172 (42000): Result consisted of more than one r