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

mysql的自定义函数_mysql执行自定义函数1.函数简介mysql5.0开始支持函数,函数是存在数据库中的一段sql集合,调用函数可以减少很多工作量,减少数据在数据库和应用服务器上的传输,对于提高数据处理的效率。参数类型为in类型,函数必须有返回值,与oracle等其他库函数参数类型有区别,如果做数据迁移,或许需要将函数改变成存储过程,因为mysql的存储过程参数包括in,out,inout三种模式。创建函数语法:…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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...]

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

2. 实例分析准备条件

创建表:

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);

3. 实例分析函数

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);

查询结果:

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

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;

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

查看函数状态语法:

SHOW FUNCTION STATUS [LIKE 'pattern']

查看函数的定义语法:

SHOW CREATE FUNCTION fn_name;

eg: 

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

6. 函数删除

DROP FUNCTION  [IF EXISTS]  fn_name;

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Conscript_const let var

    Conscript_const let var1.let命令基本语法ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。{leta=1varb=2console

    2022年7月29日
    6
  • 5分钟装好Rational Rose激活成功教程版 非常好用[通俗易懂]

    5分钟装好Rational Rose激活成功教程版 非常好用[通俗易懂]1:下载两个文件点此下载,第一个是安装包,第二个是打开这个安装包内镜像的工具。2.打开下载第二个压缩包的工具,名字是rmxngq_1272,里面有一个应用程序名字为:virtualdrivemaster,双击这个应用程序,会弹出一个界面,把下载的第一个压缩包第一个bin文件(IBM.rational….

    2022年6月22日
    56
  • linux内核模块加载命令

    linux内核模块加载命令1、lsmod列加以挂载的内核模块;lsmod是列出目前系统中已加载的模块的名称及大小等;另外我们还可以查看/proc/modules,我们一样可以知道系统已经加载的模块;[root@localhostbeinan]#lsmod2、modinfo查看模块信息;modinfo可以查看模块的信息,通过查看模块信息来判定这个模块的用途;[root@localhostbeinan]#moinfo模块名举例:查看br_netfilter模块[root@ct~]#m

    2022年7月23日
    26
  • C# LDAP认证登录

    http://blog.csdn.net/lnas_01/article/details/43987259publicclassLDAPHelper{stringldapUrl="LDAP://***.***.48.110:389/dc=***,dc=com";stringldapUserName="cn=root,dc=***,dc=com";…

    2022年4月9日
    54
  • NHibernate 进阶

    NHibernate 进阶  在我的最近文章中,我介绍了 Nhibernate。在这里和在其他的论坛中 , 因为我没有强调NHibernate 只是许多可得的 ORM 解决方案之一,(事实上,现在对.NET开发者来说,开源的加上商业的 ORM 的架构现在是超过 50个可供选择)。 作为一个开发顾问,我会经常用到Hibernate(大家都知道它吧)既然我必须在.NET平台下选择一个,NHibernate是我最明智的选择。 我

    2022年7月14日
    16
  • java根据子节点获取它对应的所有父节点_java根据父节点查找子节点

    java根据子节点获取它对应的所有父节点_java根据父节点查找子节点递归获取所有子节点测试用例:/***递归获取所有子节点,不包含自己*/publicclassgetChildren{ staticList<Map<String,Object>>childCategoryList=newArrayList<Map<String,Object>>(); publicsta…

    2022年9月17日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号