当前位置:网站首页>MySQL学习笔记(2)——存储过程与存储函数
MySQL学习笔记(2)——存储过程与存储函数
2022-07-27 16:25:00 【热爱旅行的小李同学】
MySQL学习笔记(2)——存储过程与存储函数
文章目录
一、存储过程
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()
BEGIN
INSERT 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))
BEGIN
SELECT * FROM stu WHERE NAME = t_name;
END;
//
-- 调用
CALL pro2('jack');
SELECT * FROM stu;

DELIMITER //
CREATE PROCEDURE pro3(IN id INT,IN NAME VARCHAR(32))
BEGIN
DECLARE 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))
BEGIN
SELECT stu.`name`
INTO NAME
FROM 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)
BEGIN
SELECT stu.`name`,stu.`age`
INTO NAME,age
FROM 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)
BEGIN
SET 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()
BEGIN
SELECT * 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
BEGIN
DECLARE 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
BEGIN
SET @a=0; -- 定义一个用户变量
SELECT id
INTO @a
FROM stu
WHERE 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
BEGIN
DECLARE result FLOAT DEFAULT 0;
SET result = a + b;
RETURN result;
END;
//
SELECT num_sum(1,2);

结语
水平有限,难免有纰漏之处,望各位大佬敲打!
边栏推荐
- Resource for NS2 beginner
- Low noise anion fan touch IC
- Unity learning notes (realize the conveyor belt)
- Unity显示Kinect捕获的镜头
- Using functions to extract numbers from text strings in Excel
- normal distribution, lognormal distribution,正态随机数的生成
- C#与Mysql数据库交互-Mysql配置及增删查改操作
- MySQL 04 高级查询(二)
- 用函数在Excel中从文本字符串提取数字
- How to break the team with automated testing
猜你喜欢

JMeter interface automation - how to solve the content type conflict of request headers

"Testing novice encyclopedia" 5-minute quick start pytest automated testing framework

IDEA连接数据库时区问题,报红Server returns invalid timezone. Need to set ‘serverTimezone‘ property.

Day 3 of leetcode question brushing

正则表达式的扩展

连续时间系统的性能分析(2)-二阶系统性能改善方式PID,PR

Unity shows Kinect captured shots

Netred RGB mirror light touch chip-dlt8s15b-jericho

Leetcode brushes questions the next day

MongoDB
随机推荐
During the interface test, connect to the database and back up, restore and verify the data source
C file and folder input / output stream code
NPM basic use
Acquisition data transmission mode and online monitoring system of vibrating wire wireless acquisition instrument for engineering instruments
Unity display Kinect depth data
ES6-新增方法
Kinect for unity3d - backgroundremovaldemo learning
Selenium automated test interview questions family bucket
Redis annotation
log4j. Properties log details
自控原理学习笔记-系统稳定性分析(2)-环路分析及Nyquist-Bode判据
Latex使用--subfigure竖排图形
`this.$ Emit ` the child component passes multiple parameters to the parent component
Intelligent insomnia therapeutic instrument product dlt8p68sa Jericho
用函数在Excel中从文本字符串提取数字
Unity learning notes (rigid body physics collider trigger)
Leetcode brushes questions the next day
自控原理学习笔记-系统稳定性分析(1)-BIBO稳定及Routh判据
Latex use - subfigure vertical graphics
WSN journal indexed by SCI