项目需要写割接脚本,然后用到了函数。之前没机会使用过,现学现用了一下,效果不错。
函数和存储过程区别:
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,…)