MySQL数据库存储过程简介

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】哪位大神告诉一下,为什么加了分支或者循环语句,这个编辑器就不显示颜色了呢,能改么....我强迫症啊 ...啊啊...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值