mysql自定义函数

news2024/11/25 20:33:51
  1. 函数简介
    mysql 5.0开始支持函数,函数是存在数据库中的一段sql集合,调用函数可以减少很多工作量,

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

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

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

创建函数语法:

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: 函数体

更改函数语法:

ALTER FUNCTION fn_name [characteristic...]
  1. 实例分析准备条件
    创建表:
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;

插入数据:

INSERT INTO t_user_main (f_userName, f_age) 
VALUES('one',24),('two',25),('three',26),('four',27),('five',28),('six',29);
  1. 实例分析函数
    eg:
#创建一个函数
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中使用函数:

SELECT user_main_fn(1) FROM DUAL;

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

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

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

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

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

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

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;

查询新建函数:

SELECT user_main_fn2(1);
查询结果:
在这里插入图片描述
4. 函数中变量的使用
MySql中变量从5.1后不区分大小写。

变量的定义:

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

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

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

变量定义语法:

DECLARE var_name[,...] type [DEFAULT value]
在函数中定义变量的用法:

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:

DECLARE v_testSet VARCHAR(50);
 
SET v_testSet = 'testSet';

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

使用语法:

SELECT col_name[,...] INTO var_name[,...] table_expr;

eg:

SELECT f_userName INTO v_userName FROM t_user_main WHERE f_userId = v_id;
  1. 查看函数状态或定义语句
    查看函数状态语法:
SHOW FUNCTION STATUS [LIKE 'pattern']

查看函数的定义语法:

SHOW CREATE FUNCTION fn_name;

在这里插入图片描述
6. 函数删除

DROP FUNCTION  [IF EXISTS]  fn_name;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1097536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

13年测试老鸟,性能测试内存泄露——案例分析(超细整理)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、环境配置 1&a…

epiiAdmin框架注意事项

1,epiiAdmin文档地址: 简介/安装 EpiiAdmin中文文档 看云 2,项目性想新建模块 composer.json文件——autoload选项——psr-4下增加模块名称,然后执行composer update命令。 "autoload": {"psr-4": {"…

springboot+html实现简单注册登录

前端&#xff1a; register.html <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>register</title><link rel"stylesheet" type"text/css" href"/css/style.css&…

Find My产品|智能头盔与苹果Find My结合,智能防丢,全球定位

智能头盔作为一种新兴的智能穿戴设备&#xff0c;融合了先进的技术和先进的安全特性。当下&#xff0c;全球智能头盔市场规模预计将在未来几年内达到令人吃惊的规模。智能头盔在运动、娱乐、工业等领域具有广泛的应用。 智能头盔作为一种能够提供保护和监测功能的穿戴设备&…

scrollIntoView使用与属性详解

scrollIntoView 使用与属性详解 效果图如下图所示 如果要想让元素滚动到指定位置 window.onload function () {containerItems[6].scrollIntoView({ behavior: "smooth" }); };js 代码 const containerItems document.querySelectorAll(".container div&…

jmeter(二):jmeter组件总结,利用取样器中http发送请求

JMeter 的主要测试组件总结如下 1. 测试计划是使用 JMeter 进行测试的起点&#xff0c;它是其它 JMeter 测试元件的容器 2. 线程组代表一定数量的并发用户&#xff0c;它可以用来模拟并发用户发送请求。实际的 请求内容在Sampler中定义&#xff0c;它被线程组包含。 3. 监听…

docker ---rabbitmq 安装

第一步:安装rabbitmq sudo docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management第二步&#xff1a;安装延迟队列插件&#xff08;因为使用了延迟队列&#xff09; 1、将插件 放入 /plugins/ 目录下&#xff08;需要先将插件文件放入宿主…

C++项目实战——基于多设计模式下的同步异步日志系统-⑩-异步缓冲区类与异步工作器类设计

文章目录 专栏导读异步缓冲区设计思想异步缓冲区类设计异步工作器类设计异步日志器设计 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师&#xff0c;阿里云专家博主&#xff0c;CSDN内容…

数据结构----算法--排序算法

数据结构----算法–排序算法 一.冒泡排序&#xff08;BubbleSort&#xff09; 1.冒泡排序的核心思想 相邻两个元素进行大小比较&#xff0c;如果前一个比后一个大&#xff0c;就交换 注意&#xff1a; 在冒泡排序的过程中&#xff0c;促进了大的数往后去&#xff0c;小的数…

2023年中国功率半导体分立器件发展趋势分析:产品向高效率、低成本发展[图]

功率半导体分立器件是指被规定完成某种基本功能&#xff0c;并且本身在功能上不能再细分的半导体器件。功率半导体分立器件的应用几乎覆盖所有的电子制造业&#xff0c;传统应用领域包括消费电子、网络通讯等&#xff1b;近年来&#xff0c;汽车电子及充电系统、新能源发电等领…

log4j2同步日志引发的性能问题 | 京东物流技术团队

1 问题回顾 1.1 问题描述 在项目的性能测试中&#xff0c;相关的接口的随着并发数增加&#xff0c;接口的响应时间变长&#xff0c;接口吞吐不再增长&#xff0c;应用的CPU使用率较高。 1.2 分析思路 谁导致的CPU较高&#xff0c;阻塞接口TPS的增长&#xff1f;接口的响应时…

零基础实战部署云服务器项目-服务器部署(window server2012)

目录 什么是服务器呢&#xff1f; 项目服务器运行环境 一、申请服务器 1.找店铺 2.1选配置 型号 2.2配置&#xff08;具体配置&#xff09; 3.下单 4.收货 情况一&#xff1a;弹窗有进入控制台 情况二&#xff1a;手快关闭了窗口 所以下一步我们远程连接 方法二&#xff1a;win…

实验室安全巡检管理系统—全面安全检查

安全巡检管理系统可以代替传统的线下纸质巡查&#xff0c;微信扫码进行巡检记录、隐患上报、设备保养维护等工作&#xff0c;管理人员可远程实时查看巡查情况&#xff0c;同时在巡查结束后对现场问题进行闭环整改管理。大大提高现场巡查效率&#xff0c;辅助用户对巡查工作实时…

代码随想录二刷 Day 35

122.买卖股票的最佳时机 II 数组两两求差&#xff0c;然后把正数加起来 class Solution { public:int maxProfit(vector<int>& prices) {int sum0;int diff0;for(int i0;i<prices.size()-1;i){diff prices[i1] - prices[i];if(diff>0){sumdiff;}} return su…

智慧公厕设计选哪家?智慧公厕厂家创新性智慧公厕建设方案揭秘

随着人们生活水平的提高&#xff0c;公共卫生设施的建设也变得越来越重要。其中&#xff0c;智慧公厕作为一种创新的建设方案&#xff0c;备受关注。那么&#xff0c;在众多智慧公厕厂家中&#xff0c;广州中期科技有限公司的智慧公厕怎么建设&#xff1f;其中的技术方案有何独…

【广州华锐互动】利用VR开展高压电缆运维实训,提供更加真实、安全的学习环境

VR高压电缆维护实训系统由广州华锐互动开发&#xff0c;应用于多家供电企业的员工培训中&#xff0c;该系统突破了传统培训的限制&#xff0c;为学员提供了更加真实、安全的学习环境&#xff0c;提高了培训效率和效果。 传统电缆井下运维培训通常是在实际井下环境中进行&#x…

Protocols/面向协议编程, DependencyInjection/依赖式注入 的使用

1. Protocols 定义实现协议&#xff0c;面向协议编码 1.1 创建面向协议实例 ProtocolsBootcamp.swift import SwiftUI/// 颜色样式协议 protocol ColorThemeProtocol {var primary: Color { get }var secondary: Color { get }var tertiary: Color { get } }struct DefaultCol…

MySQL JSON_TABLE() 函数

JSON_TABLE()函数从一个指定的JSON文档中提取数据并返回一个具有指定列的关系表。 应用&#xff1a;数据库字段以JSON 存储后&#xff0c;实际应用需要对其中一个字段进行查询 语法 JSON_TABLE(json,path COLUMNS(column[,column[,...]]))column:name参数 json必需的。一个 …

2023年全球半导体零部件市场发展现状分析:半导体零部件行业集中度高[图]

半导体零部件指的是在材料、结构、工艺、精度和品质、稳定性及可靠性等性能方面符合半导体设备技术要求的零部件&#xff0c;如O-Ring密封圈、精密轴承、射频电源、静电吸盘&#xff08;ESC&#xff09;、MFC流量计、石英件、硅及碳化硅件等。 半导体零部件分类 资料来源&…