函数删除与创建

确保函数名唯一,在创建时需要先删除同名函数,实现的方式可以通过一下两种方式:
创建或替换

  1. CREATE OR REPLACE FUNCTION

删除后创建

DROP FUNCTION IF EXISTS `FUNCTION_NAME`;
CREATE FUNCTION

函数示例

IP转化成整数

DROP FUNCTION IF EXISTS `GAOX_A2UI`;
CREATE FUNCTION `GAOX_A2UI` ( ip CHAR ( 31 ) ) 
-- 返回值类型
RETURNS  INT UNSIGNED
BEGIN
-- 定义变量及类型
DECLARE    value1 CHAR ( 10 );
DECLARE    value2 CHAR ( 10 );
DECLARE    value3 CHAR ( 10 );
DECLARE    value4 CHAR ( 10 );

SET value1 = SUBSTRING_INDEX( ip, '.', 1 );

SET value2 = SUBSTRING_INDEX( ip, '.', 2 );
SET value2 = SUBSTRING_INDEX( value2, '.', - 1 );

SET value3 = SUBSTRING_INDEX( ip, '.', - 2 );
SET value3 = SUBSTRING_INDEX( value3, '.', 1 );

SET value4 = SUBSTRING_INDEX( ip, '.', - 1 );

SET value1 = value1 << 24;
SET value2 = value2 << 16;
SET value3 = value3 << 8;
-- 这里进行了一步转换,将char数组转换成无符号int
-- RETURN CONVERT((value1 + value2 + value3 + value4),UNSIGNED INT);
-- 内部自动类型转换
RETURN (value1 + value2 + value3 + value4);
END;

调用外部函数和MySQL自带的函数是一样的,

SELECT GAOX_A2UI("192.168.1.38") as ipi;

整数转IP,可以选择填充0

DROP FUNCTION IF EXISTS `GAOX_UI2A`;
CREATE FUNCTION `GAOX_UI2A` ( ip INT UNSIGNED, fullAddr INT ) 
RETURNS CHAR ( 31 ) 

BEGIN
DECLARE    str4 CHAR ( 3 );
DECLARE    str3 CHAR ( 3 );
DECLARE    str2 CHAR ( 3 );

-- 取后八位二进制
SET str4 = ip & 0xFF;
-- 右移8位
SET ip = ip >> 8;
SET str3 = ip & 0xFF;
SET ip = ip >> 8;
SET str2 = ip & 0xFF;
SET ip = ip >> 8;

IF fullAddr =1 THEN
SET ip = LPAD( ip, 3, '0' );
SET str2 = LPAD( str2, 3, '0' );
SET str3 = LPAD( str3, 3, '0' );
SET str4 = LPAD( str4, 3, '0' );    
END IF;

RETURN CONCAT( ip, '.', str2, '.', str3, '.', str4 );
END;
SELECT INET_ATON('192.168.1.38') as ipa
UNION ALL
SELECT    GAOX_UI2A ( 3232235814 ,0) as ipa
UNION ALL
SELECT    GAOX_UI2A ( 3232235814 ,1) as ipa;

参考

http://dcx.sybase.com/1101/zh/dbreference_zh11/create-function-user-defined-statement.html
https://dev.mysql.com/doc/refman/8.0/en/create-procedure.html