MariaDB函数在11.8版本中不起作用。
我创建了一个Liquibase脚本来执行MariaDB函数。
该脚本在MariaDB 10.6(SIT)上运行没有问题。
然而,当我在另一台服务器(UAT)上运行,该服务器已迁移到11.8.3时,脚本返回错误。
--changeset test:20260120_fn_GetLevel splitStatements:false endDelimiter:;
--comment: Create fn_GetLevel function
CREATE FUNCTION `fn_GetLevel`(
p_NodeKey VARCHAR(1000)
)
RETURNS INT
LANGUAGE SQL
BEGIN
RETURN LENGTH(p_NodeKey) - LENGTH(REPLACE(p_NodeKey, '/', '')) - 1;
END;
--rollback DROP FUNCTION IF EXISTS `fn_GetLevel`;
也尝试在Heidi中手动运行(作为脚本,而非查询),结果同样失败。
DELIMITER //
CREATE FUNCTION `fn_GetLevel`(
p_NodeKey VARCHAR(1000)
)
RETURNS INT
LANGUAGE SQL
BEGIN
RETURN LENGTH(p_NodeKey) - LENGTH(REPLACE(p_NodeKey, '/', '')) - 1;
END //
在10.6版本中,我还使用下面两项来替代LANGUAGE SQL:
DETERMINISTIC
READS SQL DATA
但错误提示为:
java.sql.SQLSyntaxErrorException: (conn=102681) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'RETURNS INT
LANGUAGE SQL
BEGIN
RETURN LENGTH(p_NodeKey) - LENGTH(REPLACE(...' at line 4
有何想法?似乎MariaDB 11.8有我不知晓的变更。
基于反馈更新:
select version结果 = "11.8.6-3-MariaDB-enterprise-log"
在将LANGUAGE SQL改为DETERMINISTIC NO SQL之后,错误为:
Caused by: java.sql.SQLSyntaxErrorException: (conn=103289) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'RETURNS INT
DETERMINISTIC
NO SQL
BEGIN
RETURN LENGTH(p_NodeKey) - LENGTH(...' at line 4
解决方案
我通常不在MySQL或 MariaDB的存储过程/函数定义中看到 LANGUAGE SQL 这样的语法。尝试去掉它:
CREATE FUNCTION fn_GetLevel (
p_NodeKey VARCHAR(1000)
)
RETURNS INT
DETERMINISTIC
NO SQL
BEGIN
RETURN LENGTH(p_NodeKey) - LENGTH(REPLACE(p_NodeKey, '/', '')) - 1;
END;
备选方案
假设:对多语句DDL的解析有问题。你可以尝试在没有 BEGIN END 块的情况下使用函数,以确保只有一个分号:
CREATE FUNCTION `fn_GetLevel`(p_NodeKey VARCHAR(1000))
RETURNS INT
LANGUAGE SQL
RETURN LENGTH(p_NodeKey) - LENGTH(REPLACE(p_NodeKey, '/', '')) - 1;
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。