mysql存储过程优点是执行效率非常快!因为存储过程是在数据库的服务器端执行的,缺点是移植性很差!不同数据库的存储过程是不能移植。为了便于理解,先看看student表的结构。
1:查询student表所有数据的存储过程,mysql存储过程语句如下,后面格式都不再作解释:
DELIMITER $ //申明存储过程,$代表开始符号,另外一个$代表结束符号 CREATE PROCEDURE pro_test() //存储过程名称 BEGIN select *from student; END $ //调用存储过程方式 CALL pro_test();
运行结果和上图一样。
2:输入参的存储过程,虽然只有输入参数,但是还是会有结果的,mysql语句,IN代表关键字。
DELIMITER $ CREATE PROCEDURE pro_input(IN sid int) BEGIN select *from student where id = sid; END $ //调用方式 CALL pro_input(901);
输出结果为id=901的那一行数据,关键字为OUT。
3:输出参存储过程。
DELIMITER $ CREATE PROCEDURE pro_out(OUT str varchar(20)) BEGIN select name from student where id = 901; set str = ""; END $ //调用方式 CALL pro_out(@str); //获取输出参数str select @str;
输出结果为:"张老大",虽然有赋值set str="",但是第二句如果不是单独使用则赋值无效,结果以select xxx为准。
4:输入输出参存储过程,关键字为INOUT。
DELIMITER $ CREATE PROCEDURE pro_input_out(INOUT n int) BEGIN select n; set n = 100; END $ //输入的n值为10, set @n = 10; CALL pro_input_out(@n); SELECT @n;
输出结果为:10,和上面一样,以select xxx的结果为准。
5:带有if条件判断的mysql存储过程,代码如下。
DELIMITER $ CREATE PROCEDURE pro_testIf(IN num int,OUT str varchar(20)) BEGIN IF num=1 THEN SET str='星期一'; ELSEIF num=2 THEN SET str='星期二'; ELSEIF num=3 THEN SET str='星期三'; ELSE SET str='输入错误'; END IF; END $ //调用存储过程 CALL pro_testIf(4,@str); //获取输出字符串 SELECT @str;
输出结果为:“输入错误”,跟我们所学的if结果是一样的。
6:带有while循环语句的存储过程,需求: 输入一个整数,求和。例如,输入100,统计1-100的和。
DELIMITER $ CREATE PROCEDURE pro_testWhile(IN num int,OUT result int) BEGIN -- 定义一个局部变量 DECLARE i INT DEFAULT 1; DECLARE vsum INT DEFAULT 0; WHILE i<=num DO SET vsum = vsum+i; SET i=i+1; END WHILE; SET result=vsum; END $ //调用while存储过程 CALL pro_testWhile(100,@result); //输出1到100的和 SELECT @result;
7:将查询的结果赋值给变量,关键字为INTO,如下。
DELIMITER $ CREATE PROCEDURE pro_findById(IN eid int,OUT vname varchar(20) ) BEGIN SELECT name INTO vname FROM student WHERE id=eid; END $ //调用存储过程,值会赋给vname CALL pro_findById2(901,@vname ); //获取值 SELECT @vname;
输出结果为:"张老大",和第3个存储过程的结果是一样的。
8:删除存储过程,步骤都一样,如下。
�DROP PROCEDURE pro_findById;� //pro_findById代表存储过程名称