当前位置:网站首页>mysql数据库基础:存储过程和函数
mysql数据库基础:存储过程和函数
2022-06-30 09:46:00 【持久的棒棒君】
存储过程和函数
类似于java中的方法,可以提高代码的复用性,简化操作,减少了编译次数,并且减少了和数据库服务器的连接次数,提高了效率。
1、存储过程
1.1 含义
一组预先编译好的sql语句的集合,可以理解成批处理语句
- 优点:
- 存储过程可以把复杂逻辑封装在一个单元中
- 存储过程可以回传值,并可以接收参数
- 存储过程可以用在数据检验和业务逻辑实现
1.2 创建存储过程
# 更改sql语句的结束符号为$$
delimiter $$
# 创建存储过程
create procedure 存储过程名(参数列表)
begin
存储过程体(一组合法的sql语句);
end
$$
# 将sql语句的结束标记重新设为分号
delimiter ;
注意:
1、参数列表中包含三个部分:参数模式 参数名 参数类型
- 参数模式
- IN:该参数可以作为输入,也就是该参数需要调用方法传入值
- OUT:该参数可以作为输入,也就是该参数可以作为返回值
- INOUT:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
举例
in stuname varchar(20);2、如果存储过程体中仅仅只有一句话,那么begin…end可以省略
3、存储过程体中的每条sql语句的结尾要求必须加分号。
4、存储过程的结尾需要delimiter设置结束标记,这个结束标记的符号可以自己定义,作用是更改sql语句的结束符,如下
语法:delimiter 结束标记
案例:delimiter $$
记得最后重新将分号设置为结束符。为什么要改分隔符
1.3 调用语法
call 存储过程名(实参列表);
1.4 简单使用
# ======================================
# 案例1:空参的存储过程,往admin表中插入五条记录
# 创建admin表
CREATE table admin(
id INT PRIMARY KEY,
username VARCHAR(20),
password INT
);
# 往admin表中插入一些初始值
INSERT INTO admin(id,username,password) values(1,'jack',123321),(2,'rose',234432);
# 创建存储过程
delimiter $$
CREATE PROCEDURE my_data()
BEGIN
INSERT INTO admin(id,username,password) values(6,'jack',123),(7,'rose',123),(3,'john',123),(4,'lily',121),(5,'hark',1321);
END
$$
delimiter ;
# 调用存储过程
call my_data();
# =========================================
# 带in模式的存储过程
# 案例1:
delimiter $$
create PROCEDURE in_param(IN p_in INT)
BEGIN
SELECT p_in;
END
$$
# 设置变量并赋值
SET @p_in=3;
# 调用存储过程
call in_param(@p_in);
# 等同于
# CALL in_param(3);
#-------------------------------------
# 案例2:
# 创建一个boys表
CREATE TABLE boys(
id INT PRIMARY KEY,
name VARCHAR(10) NOT NULL,
age INT NOT NULL
);
INSERT INTO boys VALUES(1,'鹿晗',30);
INSERT INTO boys VALUES(2,'胡歌',30);
INSERT INTO boys VALUES(3,'陈晓',30);
# 设置结束符为$$
delimiter $$
# 创建存储过程
CREATE PROCEDURE myStorage(IN boyName varchar(10))
BEGIN
SELECT bo.*
FROM boys bo
WHERE bo.name = boyName;
END
$$
# 调用存储过程
CALL myStorage('陈晓');
# 如果参数名和列名一样,那么可以通过表名.列名的方式来区分
#======================================
# 带out模式的存储过程
# 使用前面创建过的boy表做案例
# 案例1
delimiter $$
CREATE PROCEDURE myStorage_2(IN boyName VARCHAR(10),OUT boyAge INT)
BEGIN
SELECT bo.age
FROM boys bo
WHERE bo.name = boyName;
END
$$
delimiter ;
# 根据传入的参数‘鹿晗',获取返回值,返回值用一个变量接收
CALL myStorage_2('鹿晗',@bName);
SELECT @bName; # 结果:30
# =========================================
# 带inout模式参数的存储过程
# 案例:传入a和b两个值,最终a和b都翻倍并返回
delimiter $$
CREATE PROCEDURE myStorage_3(INOUT a INT, INOUT b INT)
BEGIN
SET a=a*2;
SET b=b*2;
END
$$
delimiter ;
# 定义用户变量(变量还要用来接收返回值)
SET @m=10;
SET @n=15;
CALL myStorage_3(@m,@n);
SELECT @m,@n; #20,30
1.4 删除存储过程(命令删除)
drop procedure 存储过程名
1.5 查看存储过程
show create procedure 存储过程名;
例题补充
# 创建存储过程或函数实现传入一个日期,格式化成xx年xx月xx日的形式并返回
delimiter $$
CREATE PROCEDURE myTest_1(IN mydate DATETIME,OUT strDate VARCHAR(30))
BEGIN
SELECT DATE_FORMAT(mydate,'%y年%m月%d日') INTO strDate;
END
$$
delimiter ;
CALL myTest_1(now(),@str);
SELECT @str;
2、函数
2.1 含义
和存储过程差不多,同样是一组预先编译好的sql语句的集合,可以理解成批处理语句。
2.2 创建函数
create function 函数名(参数列表) returns 返回类型
begin
函数体
end
注意
(1)参数列表包含两部分:参数名,参数类型
(2)函数体肯定会包含return语句,如果没有会报错。如果return语句没有放在函数体的最后并不会报错。
(3)函数体中仅有一句话时则可以省略begin end
(4)同样使用delimiter语句设置结束标记,格式delimiter 结束标记
2.3 调用函数
select 函数名(参数列表);
2.4 使用实例
# 创建一个employees表(里面有四条数据)
CREATE TABLE employees(
id INT PRIMARY KEY,
name varchar(20) NOT NULL,
salary INT NOT NULL
);
INSERT INTO employees values(1,'jack',1234),(2,'tom',1234)
,(3,'sily',1234),(4,'rose',1234);
# =========================================
# 1、无参数有返回值
# 案例:返回员工的个数
delimiter $$
CREATE FUNCTION numbers() RETURNS INT
deterministic # 用于表示这是确定性函数,不使用的话会报1418的错误
BEGIN
DECLARE c INT DEFAULT 0; # 定义变量
SELECT COUNT(*) INTO c # 赋值
FROM employees;
# 返回值
RETURN c;
END
$$
delimiter ;
# 调用函数
SELECT numbers();
# 2、有参有返回
# 案例:根据员工名,返回工资
delimiter $$
CREATE FUNCTION fun_1(empName VARCHAR(20)) RETURNS INT
DETERMINISTIC
BEGIN
SET @sal=0; # 定义一个用户变量
SELECT salary INTO @sal # 赋值
FROM employees
WHERE name=empName;
RETURN @sal;
END
$$
delimiter ;
SELECT fun_1('rose');
2.5 查看函数
show create function 函数名;
2.6 删除函数
drop function 函数名;
3、存储过程和函数的区别
(1)存储过程可有0个返回,也可以有多个返回;函数有且仅有一个返回。
(2)存储过程适合做批量插入、批量更新;函数适合做处理数据后返回一个结果
边栏推荐
- ‘Failed to fetch current robot state‘ when using the ‘plan_kinematic_path‘ service #868
- Ant s19xp appeared in 140t, why is it called the computing power ceiling by the world
- KOREANO ESSENTIAL打造气质职场范
- The URL copied by the browser and pasted into the document is a hyperlink
- MySQL index, transaction and storage engine of database (2)
- MySQL log management, backup and recovery of databases (2)
- KOREANO ESSENTIAL打造气质职场范
- 【Rust日报】2021-01-22 首份Rust月刊杂志邀请大家一起参与
- 半钢同轴射频线的史密斯圆图查看和网络分析仪E5071C的射频线匹配校准
- Open source! Wenxin large model Ernie tiny lightweight technology, accurate and fast, full effect
猜你喜欢

Eth is not connected to the ore pool

Detailed explanation of SolidWorks mass characteristics (inertia tensor, moment of inertia, inertia spindle)

MySQL log management, backup and recovery of databases (1)

华南产业集团发力数字经济,城链科技发布会成功召开

‘Failed to fetch current robot state‘ when using the ‘plan_ kinematic_ path‘ service #868

6.Redis新数据类型

"Kunming City coffee map" activity was launched again

"Kunming City coffee map" activity was launched again

IPhone address book import into Excel

ArcGIS Pro脚本工具(6)——修复CAD图层数据源
随机推荐
调试方法和技巧详解
Automated stock trading ensemble strategy based on Reinforcement Learning
乡村振兴公益基金启动暨古茶树非遗保护公益行发布
OSError: [Errno 28] No space left on device
Jump table introduction
半钢同轴射频线的史密斯圆图查看和网络分析仪E5071C的射频线匹配校准
长城数艺数字藏品平台发布创世徽章
Compare the maximum computing power of the Cenozoic top ant s19xp and the existing s19pro in bitland
Appium automation test foundation - ADB shell command
Setting up the d2lbook environment for Li Mu's "hands on learning and deep learning"
[ark UI] implementation of the startup page of harmoniyos ETS
新冠无情人有情,芸众惠爱心善举暖人间——捐赠商丘市儿童福利院公益行动
Basic MySQL operation commands of database
光明行动:共同呵护好孩子的眼睛——广西实施光明行动实地考察调研综述
Guolin was crowned the third place of global popularity of perfect master in the third quarter of 2022
The preliminary round of the sixth season of 2022 perfect children's model Hefei competition area was successfully concluded
《锦绣中华》中老年公益文旅游-走进佛山敬老院
Launch of Rural Revitalization public welfare fund and release of public welfare bank for intangible cultural heritage protection of ancient tea tree
GD32 RT-Thread RTC驱动函数
MySQL advanced SQL statement of database (1)
