SET GLOBAL log_bin_trust_function_creators=TRUE;
- 自定义函数
-- MySQL默认是以分号作为SQL语句的结束符的,而函数体内部要用到分号,所以会跟默认的SQL结束符发生冲突,所以需要先定义一个其他的符号作为SQL的结束符; DELIMITER $$ -- 定义一个结束标识符 DROP FUNCTION IF EXISTS `ry`.`getdate` $$ CREATE FUNCTION `ry`.`getdate`(gdate datetime) RETURNS varchar(255) BEGIN DECLARE x VARCHAR(255) DEFAULT CURRENT_DATE; -- DECLARE 是定义函数体的变量 SET x= date_format(gdate,'%Y年%m月%d日%h时%i分%s秒'); -- SET给x变量赋值 RETURN x; -- RETURN 是返回值,必须与定义的返回类型一致 END $$ DELIMITER ; -- 恢复MySQL默认的结束符 ;
- 调用
SELECT getdate('2009-06-23 00:00:00');
- 分支结构
DELIMITER $$ DROP FUNCTION IF EXISTS `ry`.`cutString` $$ CREATE FUNCTION `ry`.`cutString`(s VARCHAR(255),n INT) RETURNS varchar(255) BEGIN IF(ISNULL(s)) THEN RETURN ''; ELSEIF CHAR_LENGTH(s)<n THEN RETURN s; ELSEIF CHAR_LENGTH(S)=n THEN RETURN '相等'; ELSE RETURN CONCAT(LEFT(s,n),'...'); END IF; END $$ DELIMITER ;
- 调用
SELECT cutString('abcdefghijklmnopqrstuvwxyz',5); -- 'abced...'
- 循环结构
DELIMITER $$ DROP FUNCTION IF EXISTS `ry`.`morestar`$$ CREATE FUNCTION `ry`.`morestar`(n INT) RETURNS text BEGIN DECLARE i INT DEFAULT 0; DECLARE s TEXT DEFAULT ''; myloop:LOOP SET i=i+1; SET s = CONCAT(s,'*'); IF i > n THEN LEAVE myloop; END IF; END LOOP myloop; RETURN s; END $$ DELIMITER ;
- 调用
SELECT morestar(5); -- ******