大家好,我是一只学弱狗,记录学习的点点滴滴!
优质文章
优质专栏
前面我们学习了Mysql变量,今天我们来了解下Mysql中的存储过程与函数,这两者既有相同点,又有所差异,接下来,我们就来说说它们的庐山真面目吧!
学过其它程序设计语言,像Java、C++的读者应该都知道,对于这些程序设计语言而言,函数是非常重要的,它不仅简化了操作,而且也提高了代码的重用性,同样的,存储过程和函数的作用也是如此,在上面两点的基础上,它们减少了编译次数且减少了和数据库服务器的连接次数,提高了效率,其在Mysql中的重要性也是占有一定地位的,那好,我们先来看下存储过程
存储过程
含义
存储过程是一组预先编译好的SQL语句的集合,可以理解成批处理语句,可以有零个或多个返回,适合做批量插入,批量更新
创建语法
create procedure 存储过程名(参数模式 参数名 参数类型)
begin
存储过程体(一组合法的SQL语句)
end
参数模式
- IN:该参数模式可以作为输入,即该参数需要调用方传入值
- OUT:该参数模式可以作为输出,即该参数可以作为返回值
- INOUT:该参数模式既可以作为输入又可以作为输出,即该参数模式既需要传入值,又可以返回值
注:
- 若存储过程体中仅仅只有一条SQL语句,begin end可以省略
- 存储过程体中的每条SQL语句的结尾要求必须加分号
- 存储过程的结尾可以使用delimiter重新设置,详见百度经验
调用语法
call 存储过程名(实参列表);
我们来举四个分别为空参、带IN参数模式、带OUT参数模式和带INOUT参数模式的案例,让大家来进一步了解下存储过程
案例一(空参):创建表admin,并向其中插入五条记录
DROP TABLE IF EXISTS admin;#若表admin存在,则删除
CREATE TABLE IF NOT EXISTS admin(#若表admin不存在,则创建
id INT PRIMARY KEY AUTO_INCREMENT,#设置字段id的约束条件为主键且为自增长列
username VARCHAR(20),
PASSWORD VARCHAR(20)
);
DELIMITER //#设置存储过程的的结束符为//,与;区分
CREATE PROCEDURE test_1()#创建存储过程test_1
BEGIN
INSERT INTO admin(username,PASSWORD)
VALUES('John1','1111'),('John2','2222'),('John3','3333'),('John4','4444'),('John5','5555');
END //
CALL test_1();#调用存储过程test_1
SELECT * FROM admin;
上述代码执行后,结果如下
案例二(带IN参数模式):传入用户名和密码,验证是否可登陆成功(即表admin中是否存在传入的用户名和密码的记录)
DROP PROCEDURE test_2;//删除存储过程test_2
DELIMITER //
CREATE PROCEDURE test_2(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
BEGIN
DECLARE num INT DEFAULT 0;#创建局部变量num并赋默认值为0
SELECT COUNT(*) INTO num
FROM admin AS a
WHERE a.username=username
AND a.password=PASSWORD;
SELECT IF(num<>0,'成功','失败') AS 结果;
END //
以上步骤执行之后,我们来测试下,执行下面的代码
CALL test_2('John1','1111');
结果如图
我们来测试个失败的案例,执行下面的代码
CALL test_2('Ace','9999');
结果如图
案例三(带OUT参数模式):传入用户名,返回密码
DROP PROCEDURE test_3;#创建存储过程test_3
DELIMITER //
CREATE PROCEDURE test_3(IN username VARCHAR(20),OUT PASSWORD VARCHAR(20))
BEGIN
SELECT a.password INTO PASSWORD
FROM admin AS a
WHERE a.username=username;
END //
执行完上述代码后,我们来测试下,代码如下
SET @username='John3';#创建用户变量username并初始化为'John3'
CALL test_3(@username,@password);#调用存储过程test_3
SELECT @password;
结果如图
再来测试下失败的案例,代码如下
SET @username='John';
CALL test_3(@username,@password);
SELECT @password;
结果如图
案例四(带INOUT参数模式):传入a和b两个值,最终a和b都翻倍并退出
DELIMITER //
CREATE PROCEDURE test_4(INOUT a INT,INOUT b INT)
BEGIN
SET a=a*2;
SET b=b*2;
END //
我们测试它,如下代码
SET @a=2;
SET @b=4;
CALL test_4(@a,@b);
SELECT @a,@b;
结果如图
删除
DROP PROCEDURE 存储过程名;
查看结构
SHOW CREATE PROCEDURE 存储过程名;
经过上面四个案例的介绍之后,我想大家对存储过程的创建、使用、删除等操作也有了一定的了解,加下来,我们来看函数
函数
含义
函数是一组预先编译好的SQL语句的集合,可以理解成批处理语句,有且仅有一个返回,适合做处理数据后返回一个结果
创建语法
create function 函数名(参数名 参数类型) returns 返回类型
begin
函数体
end
注:
- 函数体中必须有return语句,且建议放在函数体的最后
- 函数体中仅有一条SQL语句时,则可以省略begin end
- 使用delimiter语句重新设置结束标记
调用语法
SELECT 函数名 (实参列表)
跟存储过程一样,我们也来做做个案例
案例创建函数,实现传入两个float值,返回两者之和
DROP FUNCTION test_5;
DELIMITER //
CREATE FUNCTION test_5(m INT,n INT) RETURNS INT
BEGIN
DECLARE SUM INT;
SET SUM=m+n;
RETURN SUM;
END //
执行上述代码后,我们测试
SET @m=6.5;
SET @n=3.5;
SELECT test_5(@m,@n) AS 结果;
结果如下
删除
DROP FUNCTION 函数名;
查看结构
SHOW CREATE FUNCTION 函数名;
号,关于存储过程和函数我们今天就介绍到这里了!!!