MySQL学习笔记(2)——存储过程与存储函数

MySQL学习笔记(2)——存储过程与存储函数

文章目录

  • MySQL学习笔记(2)——存储过程与存储函数
    • 一、存储过程
      • 1.概念:预先编译好的sql语句的集合,理解成批处理语句
      • 2.好处;
      • 3.语法:
      • 4.参数列表:
      • 5.参数模式:
      • 6.注意事项:
      • 7.调用语法
      • 8.实战
        • (1)参数列表为空
        • (2)参数模式为in类型:
        • (3)参数列表为out类型
        • (4)参数类型为inout类型:
      • 存储过程的其他操作
        • 删除
        • 显示存储过程
        • 注意:
    • 二、存储函数
      • 1.存储过程与存储函数的区别:
      • 2.语法
        • 2.1创建函数语法:
        • 2.2调用语法:
        • 2.3查看函数
        • 2.4删除函数
        • 2.5注意事项:
      • 3.实战
        • 3.1无参数有返回
        • 3.2有参数有返回值
        • 3.3 小练习
  • 结语

一、存储过程

1.概念:预先编译好的sql语句的集合,理解成批处理语句

2.好处;

1.提高了代码的复用性
2.简化操作
3.减少了编译次数和数据库服务器的次数,提高了效率

3.语法:

create procedure 存储过程名称(参数模式 参数名 参数类型)
begin
存储过程体
end

4.参数列表:

参数列表包含三部分:
参数模式 参数名 参数类型
举例
in stuname varchar(32)

5.参数模式:

in 该参数可以作为输入,需要调用方传入值
out 该参数可以作为输出,可以作为返回值
inout 改参数及可以作为输入、又可以作为输出

6.注意事项:

1.如果存储过程仅仅只有一句话,那么begin end可以省略
2.存储过程体中的每条sql语句的结果必须加上分号’;’
3.存储过程的结果可以使用delemiter 重新设置
语法:
delimiter 结束标记
例:delimiter //

7.调用语法

call 存储过程名(实参列表);

8.实战

(1)参数列表为空

练习:
1.批量插入数据
DELIMITER //
CREATE PROCEDURE pro1()
BEGININSERT INTO stu(id,NAME) VALUES(NULL,'jack');INSERT INTO stu(id,NAME) VALUES(NULL,'tom');INSERT INTO stu(id,NAME) VALUES(NULL,'mike');INSERT INTO stu(id,NAME) VALUES(NULL,'rose');
END;
//
-- 调用
CALL pro1();
SELECT * FROM stu;

在这里插入图片描述

(2)参数模式为in类型:

-- 有参数
DELIMITER //
CREATE PROCEDURE pro2(IN t_name VARCHAR(32))
BEGINSELECT * FROM stu WHERE NAME = t_name;
END;
//-- 调用
CALL pro2('jack');SELECT * FROM stu;

在这里插入图片描述

DELIMITER //
CREATE PROCEDURE pro3(IN id INT,IN NAME VARCHAR(32))
BEGINDECLARE result VARCHAR(32) DEFAULT '';SELECT COUNT(*)INTO result FROM stu WHERE stu.`id`=id AND stu.`name`=NAME;SELECT result; 
END;
//-- 调用
CALL pro3(15,'jack');

在这里插入图片描述

(3)参数列表为out类型

-- out类型
DELIMITER //
CREATE PROCEDURE pro4(IN id INT,OUT NAME VARCHAR(32))
BEGINSELECT stu.`name`INTO NAMEFROM stu WHERE stu.`id`=id;
END;
//-- 调用
-- 定义一个变量接收返回值
CALL pro4(1,@name);
SELECT @name;

在这里插入图片描述

-- 有两个out类型返回值
DELIMITER //
CREATE PROCEDURE pro5(IN id INT,OUT NAME VARCHAR(32),OUT age INT)
BEGINSELECT stu.`name`,stu.`age`INTO NAME,ageFROM stu WHERE stu.`id`=id;
END;
//
-- 调用
CALL pro5(1,@name2,@age);
SELECT @name2;
SELECT @age;
SELECT @name2,@age;

在这里插入图片描述

(4)参数类型为inout类型:

-- 创建带inout模式参数的存储过程-- 传入两个值a和b,最终a和b都翻倍并返回DELIMITER //
CREATE PROCEDURE pro6(INOUT a INT,INOUT b INT)
BEGINSET a=a*2;SET b=b*2;
END;-- 调用
SET @m=10;
SET @n=20;
CALL pro6(@m,@n);
SELECT @m,@n;
//

在这里插入图片描述

存储过程的其他操作

删除

格式:DROP PROCEDURE 存储过程名
注意: 一次只能删除一个存储过程

DELIMITER //
CREATE PROCEDURE pro7()
BEGINSELECT * FROM stu;
END;
//DROP PROCEDURE pro7;

显示存储过程

格式:SHOW CREATE PROCEDURE 存储过程名

SHOW CREATE PROCEDURE pro6;

在这里插入图片描述

注意:

以下操作不支持
不允许desc
DESC PROCEDURE pro7;
修改存储过程(不支持)

二、存储函数

1.存储过程与存储函数的区别:

存储过程可以有0个返回值,也可以有多个返回值,适合做批量插入,批量更新
函数:有且仅有1个返回值,适合做处理数据后返回一个结果

2.语法

2.1创建函数语法:

CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN函数体
END

注意:
参数列表包含两个部分:参数名 参数类型

函数体:
一定要有return语句,否则将报错,建议放在函数体的最后

当函数体只有一句话,则begin end 可以省略

2.2调用语法:

SELECT 函数名(参数列表)

执行完语句,得到返回值

2.3查看函数

语法: SHOW CREATE FUNCTION 函数名称

SHOW CREATE FUNCTION fun2;

test

2.4删除函数

语法:DROP FUNCTION 函数名

DROP FUNCTION fun2;

2.5注意事项:

函数一般也不会去修改

3.实战

3.1无参数有返回

返回学生个数DELIMITER //
CREATE FUNCTION fun1() RETURNS INT
BEGINDECLARE result INT DEFAULT 0;-- 变量声明SELECT COUNT(*) INTO result FROM stu;RETURN result;
END;
//SELECT fun1();SELECT * FROM stu;

在这里插入图片描述

3.2有参数有返回值

-- 根据学生名返回学生id
DELIMITER //
CREATE FUNCTION fun2(sname VARCHAR(32)) RETURNS INT
BEGINSET @a=0; -- 定义一个用户变量SELECT idINTO @aFROM stuWHERE NAME = sname; RETURN @a;
END;
//SELECT fun2('jack');SELECT * FROM stu;

在这里插入图片描述

3.3 小练习

-- 创建函数:实现传入两个float,返回两者之和DELIMITER //
CREATE FUNCTION num_sum(a FLOAT,b FLOAT) RETURNS FLOAT
BEGINDECLARE result FLOAT DEFAULT 0;SET result = a + b;RETURN result;
END;
//SELECT num_sum(1,2);

在这里插入图片描述

结语

水平有限,难免有纰漏之处,望各位大佬敲打!
在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部