当前位置:网站首页>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)存储过程适合做批量插入、批量更新;函数适合做处理数据后返回一个结果
边栏推荐
- The human agent of kDa, Jinbei kd6, takes you to explore the metauniverse
- IPhone address book import into Excel
- Es common curl finishing
- [AGC] build service 3- authentication service example
- 技能梳理[email protected]语音模块+stm32+nfc
- MIT-6874-Deep Learning in the Life Sciences Week4
- Configure Yii: display MySQL extension module verification failed
- A brief introduction to database mysql
- How to seize the opportunity of NFT's "chaos"?
- 技能梳理[email protected]體感機械臂
猜你喜欢
Js獲取指定字符串指定字符比特置&指定字符比特置區間的子串【簡單詳細】
‘Failed to fetch current robot state‘ when using the ‘plan_kinematic_path‘ service #868
[email protected]體感機械臂"/>
技能梳理[email protected]體感機械臂
ArcGIS Pro + PS 矢量化用地规划图
Quick completion guide for mechanical arm (V): end effector
Detailed explanation of SolidWorks mass characteristics (inertia tensor, moment of inertia, inertia spindle)
Installation and use
MySQL advanced SQL statement of database (1)
Guolin was crowned the third place of global popularity of perfect master in the third quarter of 2022
从0使用keil5软件仿真调试GD32F305
随机推荐
基于强化学习的股票量化交易Automated-Stock-Trading-Ensemble-Strategy
Js获取指定字符串指定字符位置&指定字符位置区间的子串【简单详细】
MIT-6874-Deep Learning in the Life Sciences Week4
KOREANO ESSENTIAL打造气质职场范
Basic MySQL operation commands of database
The URL copied by the browser and pasted into the document is a hyperlink
Configure Yii: display MySQL extension module verification failed
Applying applet container technology to IOT ecological construction
Leetcode question brushing (I) -- double pointer (go Implementation)
MySQL log management, backup and recovery of databases (1)
Magnetic levitation 3D lamp
Detailed explanation of commissioning methods and techniques
Open source! Wenxin large model Ernie tiny lightweight technology, accurate and fast, full effect
ArcGIS Pro脚本工具(5)——排序后删除重复项
keras ‘InputLayer‘ object is not iterable
Appium automation test foundation - ADB shell command
Jump table introduction
“昆明城市咖啡地图”活动再度开启
Chen Haotian won the national championship of the national finals of the 7th children's model star ceremony
“昆明城市咖啡地图”再度开启,咖啡拉近城市距离