首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mysql的自定义函数_mysql执行自定义函数

mysql的自定义函数_mysql执行自定义函数

作者头像
全栈程序员站长
发布于 2022-10-04 13:21:09
发布于 2022-10-04 13:21:09
3.5K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

1. 函数简介

mysql 5.0开始支持函数,函数是存在数据库中的一段sql集合,调用函数可以减少很多工作量,

减少数据在数据库和应用服务器上的传输,对于提高数据处理的效率。参数类型为in类型,函数必须有返回值,

与oracle等其他库函数参数类型有区别,如果做数据迁移,或许需要将函数改变成存储过程,

因为mysql的存储过程参数包括in,out,inout三种模式。

创建函数语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE FUNCTION fn_name(func_parameter[,...])
RETURNS type
[characteristic...]
routine_body

参数代表含义: func_parameter: param_name type

type: 任何mysql支持的类型

characteristic: LANGUAGE SQL | [NOT]DETERMINISTIC | {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA} | SQL SECURITY {DEFINER | INVOKER} | COMMENT ‘String’

routine_body: 函数体

更改函数语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER FUNCTION fn_name [characteristic...]

characteristic: {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA} | SQL SECURITY {DEFINER | INVOKER} | COMMENT ‘String’

2. 实例分析准备条件

创建表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE `t_user_main` (
  `f_userId` int(10) NOT NULL AUTO_INCREMENT COMMENT '用户id,作为主键',
  `f_userName` varchar(5) DEFAULT NULL COMMENT '用户名',
  `f_age` int(3) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`f_userId`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

插入数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO t_user_main (f_userName, f_age) 
VALUES('one',24),('two',25),('three',26),('four',27),('five',28),('six',29);

3. 实例分析函数

eg:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#创建一个函数
DELIMITER $$ -- 定界符
-- 开始创建函数
CREATE FUNCTION user_main_fn(v_id INT)
RETURNS VARCHAR(50)
BEGIN
  -- 定义变量
  DECLARE v_userName VARCHAR(50);
  -- 给定义的变量赋值
  SELECT f_userName INTO v_userName FROM t_user_main 
  WHERE f_userId = v_id;
  -- 返回函数处理结果
  RETURN v_userName;
END $$ -- 函数创建定界符
DELIMITER; 

sql中使用函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT user_main_fn(1) FROM DUAL;

mysql中函数创建特别注意的两点:

(1) 需要定义定界符,否则是创建不了函数的,因为mysql见到’分号’就认为执行结束了,只有开始

创建时定义分界符,结束时在配对一个分界符,mysql认为这个时候才结束,使得函数能够完整编译创建。

(2)mysql创建函数是没有or replace 这个概念的,这个地方与创建视图不同。

在函数中,运行包含DDL语句,允许提交或回滚,函数中可以调用其他函数或存储过程。

#创建第二个函数,使用第一个函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELIMITER $$
CREATE FUNCTION user_main_fn2(v_id INT)
RETURNS VARCHAR(100)
BEGIN 
  #定义变量
    DECLARE v_userName VARCHAR(50);
  DECLARE  v_userNameNew VARCHAR(50);
  #通过into赋值
  SELECT f_userName INTO v_userName FROM t_user_main WHERE f_userId = v_id;
  #使用函数
  SELECT user_main_fn(v_id) INTO v_userNameNew FROM DUAL;
  #返回函数处理结果
  RETURN CONCAT(v_userName,'***',v_userNameNew);
END $$
DELIMITER;

查询新建函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT user_main_fn2(1);

查询结果:

4. 函数中变量的使用

MySql中变量从5.1后不区分大小写。

变量的定义:

通过DECLARE可以定义一个局部变量,变量的作用范围BEGIN…END块中;

变量语句必须卸载复合语句开头,并且在其他语句的前面;

一次性可以声明多个变量;

变量定义语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DECLARE var_name[,...] type [DEFAULT value]

在函数中定义变量的用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELIMITER $$
CREATE FUNCTION user_main_fn2(v_id INT)
RETURNS VARCHAR(100)
BEGIN
  #定义变量
    DECLARE v_userName VARCHAR(50);
  DECLARE  v_userNameNew VARCHAR(50);
  #定义变量,可以一次性定义多个
    #DECLARE v_userName,v_userNameNew VARCHAR(50);
  DECLARE v_testSet VARCHAR(50);
  SET v_testSet = 'testSet';
  #通过into赋值
  SELECT f_userName INTO v_userName FROM t_user_main WHERE f_userId = v_id;
  #使用函数
  SELECT user_main_fn(v_id) INTO v_userNameNew FROM DUAL;
  #返回函数处理结果
  RETURN CONCAT(v_userName,'***',v_userNameNew,v_testSet);
END $$
DELIMITER;

我们通过DECLARE 定义一个v_userName变量,变量类型为varchar,长度为50; 对于变量定义,对于同类型的变量,可以分开声明,也可以一次声明;

变量赋值:变量可以通过直接赋值,也可以通过查询语句赋值。

直接赋值语法:SET var_name = expr[,var_name=expr]…

在上面函数中,定义一个v_testSet变量,通过set直接赋值,eg:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DECLARE v_testSet VARCHAR(50);

SET v_testSet = 'testSet';

通过select…INTO…赋值,通过这种方式赋值,要求查询返回只有一行结果,

使用语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT col_name[,...] INTO var_name[,...] table_expr;

eg:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT f_userName INTO v_userName FROM t_user_main WHERE f_userId = v_id;

5. 查看函数状态或定义语句

查看函数状态语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SHOW FUNCTION STATUS [LIKE 'pattern']

查看函数的定义语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SHOW CREATE FUNCTION fn_name;

eg:

6. 函数删除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DROP FUNCTION  [IF EXISTS]  fn_name;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/195985.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月8日 上,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【MySQL高级】存储过程和函数
存储过程和函数是 事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。
陶然同学
2023/02/24
1.1K0
【MySQL高级】存储过程和函数
mysql自定义函数详解_java eval函数
CREATE FUNCTION func_name([func_parameter])RETURNSTYPE[characteristics…] routine_body
全栈程序员站长
2022/10/29
1.3K0
【数据库原理与运用|MySQL】MySQL存储过程(详细超全)
云数据库https://cloud.tencent.com/product/cdb
小小程序员
2022/12/22
1.4K0
【数据库原理与运用|MySQL】MySQL存储过程(详细超全)
mysql 自定义函数
-- 如果存在hello这个名称的函数则删除hello drop FUNCTION if exists hello; -- 创建一个叫hello的函数返回值为int类型,参数为varchar类型 参数
用户5899361
2020/12/07
1.5K0
2024Mysql And Redis基础与进阶操作系列(9)作者——LJS[含MySQL存储过程之局部、系统变量、参数传递、流程控制-判断/case具体详步骤;注意点及常见报错问题所对应的解决方法]
存储过程就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于 JAVA语言中的方法;
盛透侧视攻城狮
2024/10/22
2650
2024Mysql And Redis基础与进阶操作系列(9)作者——LJS[含MySQL存储过程之局部、系统变量、参数传递、流程控制-判断/case具体详步骤;注意点及常见报错问题所对应的解决方法]
MySQL数据库,详解流程控制语句(二)
CREATE PROCEDURE proc1(id int,sex_str varchar(8),name varchar(16))
用户1289394
2021/11/23
4240
玩转Mysql系列 - 第17篇:存储过程&自定义函数详解
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能。
路人甲Java
2019/10/09
7710
常用数据库 SQL 命令详解(下)
本文主要以 Mysql 数据库为基础,对常用 SQL 语句进行一次深度总结,由于篇幅较长,难免会有些遗漏的地方,欢迎网友留言指出!
Java极客技术
2022/12/04
1K0
mysql自定义函数详解_sql自定义函数例子
摘要 腾兴网为您分享:mysql自定义函数与动态查询,智学网,夜读小说,小睡眠,西餐菜谱等软件知识,以及猫语翻译器,江西校讯通,刷qq业务的网站,房洽洽,学士服照,爱站seo工具包,虚拟声卡驱动,隐藏分,卦象,供零在线永辉,七猫精品小说,海纳百川器,华尔街日报,双十一图片,中国地震信息网等软件it资讯,欢迎关注腾兴网。介绍下mysql自定义函数的例子,以及插入单引号的方法,动态执行查询与字符串拼接的相关内容。 1、mysql自定义函数的例子 mysql不能像oracle 一样写 动态SQL。 复制代码 代码示例: DROP f…
全栈程序员站长
2022/10/04
1.4K0
mysql自定义函数详解_数据库自定义函数
(1)DELIMITER $$ 定义结束符。MySQL默认的结束符是分号,但是函数体中可能用到分号。为了避免冲突,需要另外定义结束符。
全栈程序员站长
2022/10/03
1.9K0
mysql自定义函数详解_数据库自定义函数
mysql-存储过程(转载)
转自(http://www.cnblogs.com/exmyth/p/3303470.html)
用户2038589
2018/09/06
1K0
Mysql中的自定义函数和自定义过程
转载自 http://www.cnblogs.com/lyhabc/p/3793524.html
allsmallpig
2021/02/25
4.8K0
⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..
注意:用户定义的变量无需对其进行声明或初始化,不声明或初始化获取到的值为NULL。
.29.
2023/11/20
2.6K0
⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..
MySQL自定义函数和存储过程
MySQL函数是一些具有特定功能的方法,在编写sql时,可以进行使用,从而完成对数据的处理。
半月无霜
2023/03/03
3.1K0
MySQL自定义函数和存储过程
mysql自定义函数写法_mysql多实例部署
函数存储着一系列sql语句,调用函数就是一次性执行这些语句。所以函数可以降低语句重复。【但注意的是函数注重返回值,不注重执行过程,所以一些语句无法执行。所以函数并不是单纯的sql语句集合。】
全栈程序员站长
2022/10/04
1.4K0
MySQL进阶笔记-01
MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。如下面的==示意图==所示 :
千羽
2021/01/14
1.2K0
MySQL进阶笔记-01
mysql的学习笔记(阶段三)
-- mysql存储过程 delimiter $$ CREATE PROCEDURE proc01 () BEGIN SELECT emp_name, emp_salary FROM emp; END $$ delimiter;-- 调用存储过程 CALL proc01 ();-- 很类似调用函数(实际上就是将sql封装为函数) -- 使用变量 delimiter $$ create procedure prooc02()
兰舟千帆
2022/07/16
4470
MySQL从删库到跑路_高级(二)——自定义函数
自定义函数 (user-defined function UDF)是一种对MySQL扩展的途径,其用法和内置函数相同。 自定义函数的两个必要条件: A、参数 B、返回值(必须有)。函数可以返回任意类型的值。
良月柒
2019/03/19
6360
《MySQL核心知识》第10章:自定义存储过程和函数
今天是《MySQL核心知识》专栏的第10章,今天为大家系统的讲讲MySQL中如何自定义存储过程和函数,希望通过本章节的学习,小伙伴们能够举一反三,彻底掌握MySQL中关于自定义存储过程和函数的知识。好了,开始今天的正题吧。
冰河
2022/12/01
3.8K0
《MySQL核心知识》第10章:自定义存储过程和函数
MySQL存储过程与函数精讲
MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可。
小熊学Java
2023/07/16
6640
MySQL存储过程与函数精讲
推荐阅读
相关推荐
【MySQL高级】存储过程和函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档