mysql 自定义函数

项目需要写割接脚本,然后用到了函数。之前没机会使用过,现学现用了一下,效果不错。

函数和存储过程区别:

 

1)一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。存储过程,功能强大,可以执行包括修改表等一系列数据库操作;用户定义函数不能用于执行一组修改全局数据库状态的操作。

2)对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象。函数只能返回一个变量;而存储过程可以返回多个。存储过程的参数可以有IN,OUT,INOUT三种类型,而函数只能有IN类~~存储过程声明时不需要返回类型,而函数声明时需要描述返回类型,且函数体中必须包含一个有效的RETURN语句。

3)存储过程,可以使用非确定函数,不允许在用户定义函数主体中内置非确定函数。

4)存储过程一般是作为一个独立的部分来执行( EXECUTE 语句执行),而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。 SQL语句中不可用存储过程,而可以使用函数。

1、需求:对表task初始化数据,task_time从2019-06-01开始初始化两年的数据。数据类型为2019060100(yyyymmddHH精确到小时,按照每小时初始化数据)

BEGIN
	
    declare i int; #申明一个参数
    declare k int;
    set i= 0;#初始化值
    SELECT DATEDIFF('2021-06-01','2019-06-01')*24 INTO k;#into表示赋值
    while i<k do   # 循环条件
        insert INTO kepler_order_task(`zid`,`task_time`,`status`,`run_result`,`create_time`,`update_time`) 
values (REPLACE(UUID(),'-',''),DATE_FORMAT(DATE_ADD('2019-06-01 00',INTERVAL i HOUR),'%Y%m%d%H'),0,null,NOW(),NOW());
        set i=i+1;
     end while;

	RETURN 0;
END

用到两个函数:

DATE_FORMAT :转换时间格式
DATE_ADD : 对时间进行增减操作

UUID: 获取唯一主键  , 备注:如果是批量添加的话uuid可能会由于mysql版本的不同导致uuid是同一个。单个生成没问题。

 

2.参数为myCode,传一个邀请码,然后根据邀请码关系查询所有的上级。(如果写代码的话需要使用递归、循环之类,为了一个小功能麻烦,函数的话一个即可)

CREATE DEFINER=`test_all`@`%` FUNCTION `queryParentCustomerInfo`(myCode varchar(30)) RETURNS varchar(4000) CHARSET utf8
BEGIN
DECLARE sTemp VARCHAR(4000);
DECLARE sTempChd VARCHAR(4000);

SET sTemp='$';
SET sTempChd = CAST(myCode AS CHAR);
SET sTemp = CONCAT(sTemp,',',sTempChd);
SELECT invite_code INTO sTempChd FROM customer WHERE self_invite = sTempChd;
WHILE sTempChd is not null DO
SET sTemp = CONCAT(sTemp,',',sTempChd);
SELECT invite_code INTO sTempChd FROM customer WHERE self_invite = sTempChd;
END WHILE;
RETURN sTemp;
END

执行:

SELECT queryParentCustomerInfo('SDS12345');

返回:

$,SDS12345,*~!@#$}?

 

函数:

CAST :

MySQL 的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值。两者具体的语法如下:

CAST(value as type);

CONVERT(value, type);

就是CAST(xxx AS 类型), CONVERT(xxx,类型)。

可以转换的类型是有限制的。这个类型可以是以下值其中的一个:

  • 二进制,同带binary前缀的效果 : BINARY    
  • 字符型,可带参数 : CHAR()     
  • 日期 : DATE     
  • 时间: TIME     
  • 日期时间型 : DATETIME     
  • 浮点数 : DECIMAL      
  • 整数 : SIGNED     
  • 无符号整数 : UNSIGNED 

CONCAT:连接几个字符串

CONCAT(str1,str2,…)  

上一篇:学习记录


下一篇:Mysql 递归查询