首页 > 数据库 >mysql函数创建

mysql函数创建

时间:2023-06-12 16:38:25浏览次数:47  
标签:FUNCTION genPerson tem 创建 DELIMITER mysql 函数



文章目录

  • 前言
  • 一、mysql函数是什么?
  • 二、创建函数
  • 1.基本语法
  • 2.仿照这个写一个自己的函数
  • 总结



前言

mysql函数 与存储过程的区别:

  • 参数:存储过程对待参数有三种方式:输入(IN),输出(OUT)和输入并输出(INOUT),因为有三种方式所以必须对参数指明其用途;对于存储函数只有一种方式:输入参数,因此不需要写IN;
  • 函数有一个returns type(注意这里的return后加上s),存储过程没有也不需要这个返回语句。另外需要说明的是,returns只能对function做指定,对函数而言这是强制的,它用来指定函数的返回类型,因此函数体内必须包含一个return值,即一句return的代码
  • 调用存储过程使用call,调用存储函数可以直接使用select查看函数返回值,也可以作为其它函数的参数

一、mysql函数是什么?

示例:now() concat() substar()…这都是内置函数,今天说下我们自定义的函数;

二、创建函数

1.基本语法

参考这篇 文章 主要内容:

DELIMITER $$
DROP FUNCTION IF EXISTS genPerson$$
CREATE FUNCTION genPerson(name varchar(20)) RETURNS varchar(50)
BEGIN
  DECLARE str VARCHAR(50) DEFAULT '';
  SET @tableName=name;
  SET str=CONCAT('create table ', @tableName,'(id int, name varchar(20));');
  return str;
END $$
DELIMITER ;

解释如下:

(1)DELIMITER $$ 定义结束符。MySQL默认的结束符是分号,但是函数体中可能用到分号。为了避免冲突,需要另外定义结束符。

(2)DROP FUNCTION IF EXISTS genPerson$$ 如果函数genPerson已经存在了,就删除掉。

(3)CREATE FUNCTION 创建函数genPerson,函数的参数是name,返回值是varchar(50)。

(4)函数体放在BEGIN 与 END之间。

(5)DECLARE 声明变量,str类型是varchar(50),默认值是空。

(6)CONCAT连接多个字符串。

(7)RETURN 返回拼接后的字符串str。

1
由于我们需要用mysql中的 分号 ; 作为一句话的结束,而作为声明函数也是需要有分隔符作为结束的,所以就有了 $$ 这个符号声明下,然后最后再恢复为mysql 的默认 分隔符 ;

2
READS SQL DATA 为读取数据库数据,与之相对应的
MODIFIES SQL DATA 这表明例程包含可能写入数据的语句(例如,它包含UPDATE,INSERT,DELETE或ALTER指令)。
NO SQL 这表示例程不包含SQL语句。
CONTAINS SQL 这表示该例程包含SQL指令,但不包含读取或写入数据的语句。

2.仿照这个写一个自己的函数

我想实现一个函数层面的迭代子集查询:

mysql函数创建_SQL


例如这样的数据,是一个类似菜单的属性结构,当用到级联删除的时候,就需要查子集,然后一起处理;

DELIMITER $$

DROP FUNCTION IF EXISTS `get_childern`$$

CREATE FUNCTION `get_childern`(param VARCHAR(55)) RETURNS TEXT CHARSET utf8
    READS SQL DATA
BEGIN
	DECLARE tem LONGTEXT DEFAULT '';
	DECLARE res LONGTEXT DEFAULT '';
	SET tem = param;
	WHILE tem IS NOT NULL
	DO
	SET res = CONCAT(res,',',tem);
	SELECT GROUP_CONCAT(id) INTO tem FROM auth_menu WHERE FIND_IN_SET(menu_pid,tem);
	END WHILE;
	RETURN SUBSTR(res,2);
END$$

DELIMITER ;

大致思路如下:

1 tem 为每次的临时变量  res 为最终结果集
2 res需要每次查到当前的子集,然后不断拼接,最终返回全部结果
3 GROUP_CONCAT(id) INTO tem 每次通过 FIND_IN_SET 函数 查找当前的子集,然后放入tem中 ,作为下次的查找子集的入参;

mysql函数创建_数据库_02

调用该函数,就得到了他的迭代子集包括他自己:

mysql函数创建_mysql_03


总结

通过此次函数编写,对于mysql函数的编写有了大体的认识,其实也是一个结构化的东西,语法比较固定

DELIMITER $$
DROP FUNCTION IF EXISTS genPerson$$
CREATE FUNCTION genPerson(name varchar(20)) RETURNS varchar(50)
BEGIN
*****
END $$
DELIMITER ;

其中 ***** 的位置为主要的函数逻辑实现,其他可以照着搬过去,改改就好了


标签:FUNCTION,genPerson,tem,创建,DELIMITER,mysql,函数
From: https://blog.51cto.com/u_16158506/6463427

相关文章

  • 2020-09-10 mysql主从复制
    mysql主从复制解决问题:高并发,灾难恢复,读写分离,故障转移mysql01mysql02数据实时同步:是通过执行的dmlsql语句(包括增删改),写入到二进制日志binlog文件中,来实现数据同步的.从数据库开启一个io线程读取主数据库中的binlog文件,读取到后,开启一个sql线程,执行binlog文件.达......
  • 手写 Django orm反向迁移 MySQL
    importpymysql,os####settingsdb={'NAME':'','USER':'','PASSWORD':'','HOST':'','PORT':'',}table_name_list=[]#表名列表......
  • MySQL 允许远程连接
    下载的MySQL是8.0.33版本下载地址:https://dev.mysql.com/downloads/mysql/MySQL是部署在Win10的一台电脑上,要能其他机器也能访问,需要打开3306端口的防火墙,同时配置MySQL允许访问防火墙防火墙的设置在:设置-网络-Windows防火墙添加入站规则允许其他电脑访问mysql的33......
  • MySQL表结构转换为ClickHouse表结构
    MySQL表结构转换为ClickHouse表结构https://github.com/hcymysql/binlog_parse_sql/blob/main/mysql_to_clickhose_schema.pyhttps://github.com/hcymysql/binlog_parse_sql/blob/main/mysql_to_clickhose_schema_test.py(MySQL表结构转换为ClickHouse表结构,该工具仅为单表测试使用)C......
  • 012 数据库学习笔记--自定义函数
    自定义函数:根据自己的需要,自定义一些函数分类:标量函数、内嵌表值函数、多声明表值函数标量函数:对单一值的操作,返回单一值;包含beginend创建的时候,指定了函数所有体,调用时也必须指定函数所有者调用时,如果函数中指定了默认值,调用的时候,可使用默认值default代替在语法上r......
  • 快速创建Jenkins Job
    JenkinsJob类型1.Freestyleproject这个是jenkins的基础功能,可以用它来执行各种构建任务,他只能构建在一个电脑上,如果没有太多的需求,这个job基本够用了,它包含了所有基础功能.2.Pipeline真实的工作环境有很多job,比如先编译,然后执行静态代码检查、单元测试、然后部署服务器、......
  • 引用作为函数返回值
    “引用作为函数参数”与“引用作为函数返回值”一、引用作为函数参数作为函数参数时引用有两种原因:1、在函数内部会对此参数进行修改2、提高函数调用和运行效率关于第一点,都知道C++里提到函数就会提到形参和实参。如果函数的参数实质就是形参,不过这个形参的作用域只是在函数体内......
  • MySQL闪回工具简介 及 binlog2sql工具用法
    一、闪回工具简介1.工具分类第一类以patch形式集成到官方工具mysqlbinlog中优点上手成本低。mysqlbinlog原有的选项都能直接利用,只是多加了一个闪回选项,未来有可能被官方收录。支持离线解析。缺点兼容性差、项目活跃度不高。难以添加新功能,实战效果欠佳。安装麻烦。需要对m......
  • PROXMOX创建CEPH笔记
    1、准备工作集群内各主机一定要先做校时,保证各节点时间一致,要么安装ntpdate,要么安装chrony(建议使用这个,实现自动校时)可参考文章: https://blog.csdn.net/wylfengyujiancheng/article/details/88298708 https://blog.csdn.net/m0_47476627/article/details/1260037912、创......
  • MySQL 8.0.29 instant DDL 数据腐化问题分析
    前言Instantaddordropcolumn的主线逻辑表定义的列顺序与row存储列顺序阐述引入row版本的必要性数据腐化问题原因分析Bug重现与解析MySQL8.0.30修复方案前言DDL相对于数据库的DML之类的其他操作,相对来说是比较耗时、相对重型的操作;因此对业务的影比较严重。M......