MySQL数据库存储过程简介
一、什么是存储过程
先说一下SQL语句的执行过程
【1】首先当数据库服务器接收到客户端传来的SQL命令后,会首先建立与数据库服务器的连接;
【2】其次将命令交给MySQL的引擎来解析,分析语法是否正确,如果正确将会编译为数据库可识别的命令;
【3】然后然后进入数据库执行查询操作获得查询结果;
【4】最后将查询结果交给客户端。
存储过程就是SQL语句和控制语句预编译的集合,允许用户声明变量和流程控制,可以接受参数,也可以返回多个返回值。
二、优点
【1】缩短执行时间,提高查询效率
存储过程在第一次编译成功之后,会保存编译后的文件,删除就会一直存在,相当于封装好了一个方法,可以随时调用。
【2】增强SQL语句的灵活性
用户可以通过内部的控制语句来调整如何执行具体的SQL语句。如通过分支结构改变参数的值等。
三、怎样写一个存储过程
语法
CREATE PROCEDURE 名称( 参数列表 )
BEGIN
过程体:具体的SQL语句,可以包含控制,声明,查询语句等
END
关于参数列表:
【IN】表示该参数的值必须在调用存储过程时指定
【OUT】表示该参数的值可以被存储过程改变,并且可以作为返回值返回
【INOUT】表示该参数在调用时指定,并可以被改变和返回
1.创建普通无参数传入无返回值的存储过程
DELIMITER //
DROP PROCEDURE IF EXISTS findAllUser;
CREATE PROCEDURE findAllUser()
BEGIN
SELECT * FROM t_user;
END;
CALL findAllUser;
//
DELIMITER:当我们在MySQL客户端操作数据库时,出现分号或return等标识符,程序就会自动执行,创建存储过程时需要一次性输入多行语句,过程体中一些SQL的分号会导致程序结束
DELIMITER //
....
//
如上图,包含在双斜线之间的内容会作为一个整体打包执行,别忘了DELIMITER后的空格。
2.创建有参数传入没有返回值的存储过程
【注意】传入参数名称不要与数据库字段同名,否则不识别,如果时【DELETE】语句,有可能删除其他数据
DELIMITER //
DROP PROCEDURE IF EXISTS findUserById;
CREATE PROCEDURE findUserById(IN uid INT UNSIGNED)
BEGIN
SELECT * FROM t_user WHERE id = uid;
END;
SET @uid = 3;
CALL findUserById(@uid);
//
3.创建有参数传入有返回值的存储过程
DELIMITER //
DROP PROCEDURE IF EXISTS findUserInfoById;
CREATE PROCEDURE findUserInfoById(
IN uid INT UNSIGNED,
OUT uname VARCHAR(20)
)BEGIN
SELECT username
INTO uname
FROM t_user
WHERE id = uid;
END;
SET @uid = 5;
CALL findUserInfoById(@uid,@uname);
SELECT @uname;
//
4.创建有多个返回值的存储过程
DELIMITER //
DROP PROCEDURE IF EXISTS findUserNameById;
CREATE PROCEDURE findUserNameById(
IN uid INT UNSIGNED,
OUT uname VARCHAR(10),
OUT uphone VARCHAR(20)
)BEGIN
SELECT username, phone
INTO uname,uphone
FROM t_user
WHERE id = uid;
END;
SET @uid = 3;
CALL findUserNameById(@uid,@uname,@uphone);
SELECT @uname,@uphone;
//
DELIMITER //
DROP PROCEDURE IF EXISTS deleteUserByAge;
CREATE PROCEDURE deleteUserByAge(
IN uAge INT UNSIGNED,
OUT delUsers INT UNSIGNED,
OUT restUsers INT UNSIGNED
)BEGIN
DELETE FROM tt_user WHERE age = uAge;
SELECT ROW_COUNT() INTO delUsers;
SELECT COUNT(id) FROM tt_user INTO restUsers;
END;
SET @age = 15;
CALL deleteUserByAge(@age,@delUsers,@restUsers);
SELECT @delUsers,@restUsers;
//
【PS】落下一个INOUT参数的用法,这里补上:
【INOUT】参数是指首先被当作参数传入,后期又要被作为返回值返回的一类参数,使用方法如下:
DELIMITER //
DROP PROCEDURE IF EXISTS changeNum;
CREATE PROCEDURE changeNum(INOUT num INT UNSIGNED)
BEGIN
DECLARE n INT;
IF num >= 10 AND num < 20 THEN SET num = 10;
ELSEIF num >= 20 AND num < 30 THEN SET num = 20;
ELSEIF num >= 30 AND num < 40 THEN SET num = 30;
END IF;
END;
SET @num = 35;
CALL changeNum(@num);
SELECT @num;
//
【再PS】哪位大神告诉一下,为什么加了分支或者循环语句,这个编辑器就不显示颜色了呢,能改么....我强迫症啊 ...啊啊...