MariaDB函数在11.8版本中不起作用。

后端开发 2026-07-07

我创建了一个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;

db<>fiddle演示

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章