MySQL不仅内置了一些常用函数,同时也支持自定义函数,来满足开发者的需求

函数定义

MySQL的函数定义语法如下:

CREATE  

  • functionName:函数名,同MySQL内置函数一样,大小写不敏感
  • varName: 形参名
  • varType: 形参类型,其与varName配对使用。形参数量不限( $geq 0$)
  • returnVarType: 返回值类型。函数必须有且只能有一个返回值
  • characteristic:函数特性,下将详述
  • routine_body:函数体。函数体中必须含有 return 语句,当函数体为复合结构时,需要使用begin ... end 语句

characteristic的可用参数值如下:

| 值 | 说明 | | :-: | :-: | | language sql | 指明函数体的语言类型, 目前仅支持sql | | [not] deterministic | deterministic 指明函数的结果是确定的,即相同的输入会得到相同的输出;not deterministic意为结果不确定。默认为 not deterministic | | { contains sql | no sql | reads sql data | modifies sql data } | 指明函数体使用sql语句的限制。contains sql意为函数体包含sql语句,但不包含读写数据的sql语句;no sql意为函数体不包含sql语句;reads sql data意为函数体包含读数据sql语句;modifies sql data意为函数体包含写数据的sql语句。默认为contains sql | | sql security { definer | invoker } | 指明谁有权限执行该函数。definer意为只有定义者才能执行;invoker意为拥有权限的调用者可以执行。默认为definer | | comment 'message' | 函数的注释信息,指明函数的功能 |

示例如下:

  • 函数体为简单结构:
create    

  • 函数体为复合结构:
create

变量

局部变量

定义在sql语句块中的变量,常见于存储过程和函数的 begin ... end 中,语句块执行完后局部变量则结束生命周期

声明定义

函数中可以通过 declare 声明定义局部变量,其作用域为 begin ... end 的函数体中。默认初值为nul,可以通过default指定该语句中所有定义变量的初值

declare 

Note: declare声明定义语句,必须放在begin...end函数体中最前面的位置

赋值

  • 通过set给变量赋值
set 

[Note]: sql下的 = 操作符是比较(判定是否相等)操作符,只有在set语句中可作为赋值操作符使用。故在其他语句中,赋值操作应该使用 := 操作符

  • 通过select into 给变量赋值

通过select语句将所查询出的字段数据依次赋值到 into 后的变量中。值得一提的是,当select查询结果为空时(即,无记录),则不对变量进行赋值操作;当select查询的结果不止一条时,MySQL将报错,函数执行失败

select 

示例

create

函数测试结果如下:

用户变量

定义在当前客户端的连接下的变量,其作用域在当前客户端连接下均有效,当当前客户端断开连接后则该变量结束生命周期。其对其他客户端连接不可见

赋值

用户变量无需先行声明创建,直接赋值使用即可。赋值时,当前客户端下若无该用户变量,则会自动创建并完成赋值;查看一个不存在的用户变量时(e.g., select @foo)返回null。需要注意的是,用户变量的变量名必须以 @ 开头

  • 通过set 赋值
set 

  • 通过 select 赋值

通过select语句将所查询出的字段数据赋值到变量中,需要注意的是,只能使用 := 操作符赋值

select 

示例

常用流程控制

if 语句

if 

示例如下:

create

测试结果如下:

while 语句

[

示例如下:

create

测试结果如下:

leave、iterate

levae 和 iterate 分别用于循环控制的跳出整个循环 和 跳过循环体的剩余部分并直接进行下一次循环,作用相当于C语言中的 break和 continue。区别在于C语言中的break、continue都是针对所在层循环的控制。而levae 和 iterate是针对label所标注的循环的控制,故其可以实现从最内层循环直接跳出

levae 

示例1:

create

测试结果如下:

示例2:

create

测试结果如下:

函数相关的操作

查看函数状态

通过show status 命令查看函数的相关信息。可以在其后面使用 like 语句进行函数名匹配,其中functionName同样支持 % 进行模糊匹配

show 

示例如下:

查看函数定义

通过show create 命令查看函数的定义内容

show 

示例如下:

修改函数特性

通过alter function实现对函数特性characteristic的修改,注意,不是对函数定义内容的修改

alter 

示例如下:

删除函数

通过drop function 删除函数。当指定函数不存在时,会报错,可以添加 if exists 避免出现报错

drop 

测试结果如下:

Note

在命令行中其默认将 ; 符号作为结束符来执行语句。所以如果我们在命令行中创建函数,需要使用 delimiter 命令重定义结束符 如下图所示,先通过 delimiter $$ 将结束符更改为 $$ (可随意更改,一般常用$$)再创建函数。函数创建完毕后,通过我们重定义后的结束符结束(即 $$ )。最后不要忘记,通过 delimiter ; 将结束符重新修改为 ;

测试结果如下:

c语言怎样得到函数内参数的值_MySQL之自定义函数相关推荐

  1. c语言怎样获得函数内参数的值_C语言可变参数函数的实现原理

    在本人的<C语言可变参数函数的实现方法>一文中,介绍了如何建立自己的可变参数函数. 下面继续介绍可变参数函数的实现原理. 在汇编语言程序设计中,详细介绍了子程序的实现思想: (1)子程序只 ...

  2. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递

    python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...

  3. mysql自定义函数的分号_MySQL之自定义函数实例讲解

    转自:https://www.2cto.com/database/201804/740205.html MySQL中已经有很多函数,如时间函数等,但是有时这些函数不能满足自己的设计需求,此时需要自定义 ...

  4. linux 变量函数返回值,linux shell 自定义函数(定义、返回值、变量作用域)介绍...

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ f ...

  5. 在mysql中创建一个自定义函数来计算两个数的和_Mysql创建自定义函数

    Mysql创建用户自定义函数: >显示库中所有的自定义函数信息: show function status; >创建自定义函数的过程如下demo1: drop function if ex ...

  6. C++(13)--函数的进阶:内联、传递引用、参数默认值、重载、函数模板

    模块化编程--函数的进阶 1.内联函数 1.1 inline基本情况 1.2 inline 的前世今生-带参的宏替换 2.传递引用(重点) 2.1引用.理由.注意事项 2.3 交换两个变量的数值 3. ...

  7. go 协程回调函数 传入参数_ECMAScript 6 入门教程—Generator 函数的异步应用

    作者 | 阮一峰异步编程对 JavaScript 语言太重要.JavaScript 语言的执行环境是"单线程"的,如果没有异步编程,根本没法用,非卡死不可.本章主要介绍 Gener ...

  8. python怎么让输出结果为01_python函数基础-参数-返回值-注释-01

    什么是函数 函数就是有特定功能的工具 #python中有内置函数(python解释器预先封装好的)与自定义函数(用户自定义封装的)之分 为什么要用函数 #可以减少代码冗余,增加代码复用性#使代码逻辑更 ...

  9. c语言程序设计 第七章函数,《C语言程序设计》第七章随堂练习:自定义函数

    题目:创建一个C语言控制台程序,除了main函数外,自定义两个被调用的函数,并要求至少有一个函数包含有参数. 解答: 首先我们要了解,函数包含哪些组成结构,有四个部分,分别是:函数类型.函数名称.函数 ...

最新文章

  1. 刚刚!饶毅再次撰文,回应耿美玉,称其未遵守学术规范
  2. 金融风控实战——有监督分箱
  3. oracle索引中丢失in或out参数,oracle 11g给表建触发器错误“索引中丢失 IN 或 OUT 参数:: 1...
  4. 3维线程格 gpu_论文导读 | GPU加速子图同构算法
  5. .NETStandard FreeSql v0.0.9 功能预览
  6. cont char *p 和 char* const p 区别及记忆方法
  7. 拳王虚拟项目公社:有没免费虚拟资源池,虚拟资源平台该选择什么,虚拟资源整合赚钱
  8. mysql游标是什么特性_[转]MySQL游标特性
  9. 金庸小说人物知识图谱构建——构建共现矩阵
  10. Navicat安装问题及解决办法
  11. ROBOGUIDE软件:FANUC机器人弧焊焊接起始点接触寻位虚拟仿真
  12. 前端开发日报:20190818
  13. trim函数 html,trim函数的使用方法(你会用TRIMMEAN 函数吗?)
  14. 【遗传算法GA】--计算函数最值(Python)
  15. 韦东山ARM第一期总结
  16. 新电脑怎么把计算机放在桌面,新安装的Win10怎么将“我的电脑”放在桌面
  17. 到底什么是语义分割?
  18. oracle中exist什么意思,oracle中not exists 是什么意思 , oracle数据库中exists的作用
  19. 每日新闻丨美商务部:已允许部分美企向华为出售零部件;中国四家手机厂商瓜分印尼市场...
  20. idea中摸鱼插件_IDEA 看书摸鱼插件,时隔一年,再次更新

热门文章

  1. 阅读吴军《信息时代对人才技能的要求》
  2. Spring Boot基础学习笔记23:用户自定义授权管理
  3. Python编程基础05:运算符与表达式
  4. linux 消息对lie_Linux系统编程—消息队列
  5. 什么是计算机计算机网络的主要功能是什么,计算机网络的三大主要功能是什么?-与非网...
  6. python十大实例_Python练习实例100例(从简入难)96-100
  7. 基于微型计算机系统的实时时钟设计,基于51单片机的实时时钟设计报告.doc
  8. Unreal Engine 4 —— 多线程任务构建
  9. 虚幻引擎4.3发布:支持 iOS 8 的 Metal 图形 API
  10. LintCode,hihoCoder,LeetCode有什么区别?