首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MariaDB中生成列定义中的用户定义函数?

问MariaDB中生成列定义中的用户定义函数?
EN

Stack Overflow用户
提问于 2020-10-01 18:57:59
回答 1查看 975关注 0票数 1

根据文档,MariaDB允许在生成的列定义https://mariadb.com/kb/en/generated-columns/中使用用户定义的函数。

代码语言:javascript
复制
User-defined functions (UDFs) are supported in expressions for generated columns. However, MariaDB can't check whether a UDF is deterministic, so it is up to the user to be sure that they do not use non-deterministic UDFs with VIRTUAL generated columns. 

我使用的是MariaDB 10.3.20,我已经创建了一个确定性函数,但是当尝试创建字段时,它失败了。下面是一些示例代码。

代码语言:javascript
复制
CREATE TABLE `json_virt` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `json_arr` longtext COLLATE utf8mb4_unicode_ci NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ;

INSERT INTO json_virt SET json_arr = '["a","b"]' ;
INSERT INTO json_virt SET json_arr = '["c","d"]' ;

DELIMITER //
CREATE OR REPLACE FUNCTION `test`.`json_implode`(`data` TEXT, `sep` TEXT) 
RETURNS text 
CHARSET utf8mb4 
COLLATE utf8mb4_unicode_ci
DETERMINISTIC
SQL SECURITY INVOKER
BEGIN

    DECLARE i INT UNSIGNED DEFAULT 0 ;
    DECLARE v_count INT UNSIGNED DEFAULT JSON_LENGTH(data) ;
    DECLARE v_current_item BLOB DEFAULT NULL ;
    DECLARE v_current_path BLOB DEFAULT NULL ;
    
    DECLARE sep_length INT UNSIGNED DEFAULT CHAR_LENGTH(sep) ;
    
    DECLARE str TEXT DEFAULT '' ;
    
    WHILE i < v_count DO
        SET v_current_path =  CONCAT('$[', i, ']') ;
        
        SET v_current_item = JSON_EXTRACT(data, v_current_path) ;
        SET v_current_item = JSON_UNQUOTE(v_current_item) ;
        
        SET str = CONCAT(str, sep, v_current_item) ;
        
        SET i := i + 1;
    END WHILE;
    
    SET str = SUBSTRING(str, sep_length+1) ;
    
    RETURN str ;
    
END //
DELIMITER ;

SELECT 
json_virt.*,
json_implode(json_virt.json_arr, ', ') AS json_imp
FROM json_virt
;

ALTER TABLE `json_virt` ADD `json_str` TEXT AS (json_implodex(json_arr, ', ')) VIRTUAL ;

ALTER TABLE `json_virt` ADD `json_str1` TEXT AS json_implode('["x","y"]', ', ') VIRTUAL ;

从SELECT语句可以看到,json_implode()函数工作得很好,但是当尝试执行最后两个ALTER语句时,这两个语句都失败了。

我从几个不同的角度对此感兴趣:

  1. 为什么这个不行?
  2. 对生成的列定义起作用的UDF的示例是什么?
  3. 是否可以在生成的列定义中使用多行或更复杂的代码?
  4. 是否有更好的方法来完成我想要做的事情(使用一个JSON数组的字段并将其内爆,使每个项以逗号分隔为字符串)?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-01 23:55:21

我看到许多开发人员使用"UDF“,这是MySQL/MariaDB所称的存储函数。也就是说,用基于ANSI的语言编写并动态部署在运行的MySQL服务器上的例程。

而MySQL/MariaDB使用的术语UDF是完全不同的特性。

https://mariadb.com/kb/en/create-function-udf/说:

用户定义函数(UDF)是一种使用新函数扩展MariaDB的方法,该函数的工作方式类似于本机(内置) MariaDB函数,如ABS()或CONCAT()。UDF需要用C、C++或其他使用C调用约定的语言编写,MariaDB需要被动态编译,您的操作系统必须支持动态加载。

请注意,使用UDF更像是MySQL/MariaDB的存储函数。这可能是混乱的根源。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64161662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档