MySQL 5.0以上版本已经支持存储过程。
存储过程是一个可编程的函数,在数据库中创建并保存。它有SQL语句和一些特殊的控制结构组成。
MySQL存储过程的创建和调用
语法格式:
CREATE PROCEDURE 过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 …] 过程体
DELIMITER //
CREATE PROCEDURE my_pro(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM demo;
END //
DELIMITER ;
MySQL默认以";"为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个"//"之间的内容当做存储过程的代码,不会执行这些代码;“DELIMITER ;”的意思是把分隔符还原。除了\符号外,任何字符都可以用于语句分隔符。记得在使用新的符号作为结束分隔符后,要记得还原。
存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开。MySQL存储过程的参数用在存储过程的定义,共有三种:IN,OUT,INOUT。
IN 输入参数
表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT 输出参数
该值可在存储过程内部被改变,并可返回
INOUT 输入输出参数
调用时指定,并且可被改变和返回
存储过程过程体的开始与结束使用BEGIN与END进行标识。
执行存储过程(调用)
Call关键字:Call接受存储过程的名字以及需要传递给他的任意参数。存储过程可以显示结果,也可以不显示结果。
以下是MySQL实例使用各种类型的语句说明存储过程的使用。
1、条件语句if-then-else
delimiter // //解释使用新的符号//作为结束分隔符
DROP PROCEDURE IF EXISTS discounted_price;
CREATE PROCEDURE discounted_price
(
IN normal_price NUMERIC(8,2),
OUT discounted_price NUMERIC(8,2)
)
BEGIN
IF (normal_price > 500) and (normal_price < 1000) THEN
SET discounted_price = normal_price * .8;
ELSEIF (normal_price >=1000) THEN
SET discounted_price = normal_price * .9;
ELSE
SET discounted_price = normal_price;
END IF;
END// // 结束用新的分隔符
delimiter ; //重新还原默认的分号分隔符
调用存储过程
CALL discounted_price(800,@disprice);
SELECT @disprice;
2、case语句
delimiter //
create procedure pro_insert(in param int)
begin
case param
when 0 then
insert into student3(studentname) VALUES('利玉3');
when 1 then
insert into student3(studentname) VALUES('利玉4');
else
insert into student3(studentname) VALUES('default');
end case;
end//
delimiter;
调用存储过程
call pro_insert(2);
3、循环语句while-end while
delimiter //
create procedure pro_insert2(in param int)
begin
while param<10 do
insert into student3(studentname) VALUES('小猪');
set param=param+1;
end while;
end//
delimiter;
调用存储过程
call pro_insert2(6);
delimiter //
CREATE PROCEDURE simple_while(out counter int)
BEGIN
SET counter = 0;
while counter != 10 DO
set counter = counter + 1;
end while;
END//
delimiter;
调用存储过程
CALL simple_while(@counter);
SELECT @counter;
4、repeat...end repeat
它在执行操作后检查结果,而while则是执行前进行检查。相当于do...while
until表示满足后边的条件才继续循环
delimiter //
create procedure pro_insert3(in param int)
begin
repeat
insert into student3(studentname) VALUES('demo');
set param=param+1;
until param>10
end repeat;
end//
delimiter;
调用存储过程
call pro_insert3(8);
5、loop...end loop语句
delimiter//
CREATE PROCEDURE simple_loop(OUT counter INT)
BEGIN
SET counter = 0;
my_simple_loop:LOOP
SET counter = counter +1;
if counter = 10 THEN
LEAVE my_simple_loop;
end if;
end LOOP my_simple_loop;
END //
delimiter;
调用存储过程
CALL simple_loop(@counter);
SELECT @counter;
检查存储过程相关语句:
删除存储过程
DROP PROCEDURE 存储过程名称;
输出创建存储过程的语句
SHOW CREATE PROCEDURE 存储过程名称;
获取存储过程的详细信息,包括何时,由谁创建等信息,输出的为数据库中所有的存储过程
SHOW PROCEDURE STATUS;
关键字LIKE限制过程输出,输出指定的存储过程
SHOW PROCEDURE STATUS LIKE ‘ 存储过程名称’;
网友评论