MariaDB에서 생성된 열 정의의 사용자 정의 함수?
매뉴얼에 따르면 MariaDB는 생성된 컬럼 정의에서 사용자 정의 함수를 사용할 수 있도록 합니다.https://mariadb.com/kb/en/generated-columns/
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을 사용하고 있으며 결정론적 함수를 작성했지만 필드를 작성하려고 하면 실패합니다.여기 샘플 코드가 있습니다.
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 ;
json_implode() 함수는 SELECT 문에서 알 수 있듯이 정상적으로 동작하지만 마지막 2개의 ALTER TABLE 문을 실행하려고 하면 둘 다 실패합니다.
저는 몇 가지 다른 각도에서 이 문제에 관심이 있습니다.
- 왜 이게 안 되지?
- 생성된 컬럼 정의에서 기능하는 UDF의 예는 무엇입니까?
- 생성된 열 정의에서 여러 줄 또는 더 복잡한 코드를 사용할 수 있습니까?
- 실행하려는 작업을 수행하는 더 좋은 방법이 있습니까(JSON 어레이인 필드를 각 항목이 쉼표로 문자열로 구분되도록 삽입하십시오).
MySQL/MariaDB가 스토어드 함수라고 부르는 것을 의미할 때 "UDF"를 사용하는 개발자가 많습니다.즉, ANSI SQL 기반의 언어로 작성되어 실행 중인 MySQL Server에 동적으로 전개되는 루틴입니다.
UDF라는 용어는 MySQL/MariaDB에서 완전히 다른 기능을 위해 사용됩니다.
https://mariadb.com/kb/en/create-function-udf/은 다음과 같이 기술하고 있습니다.
사용자 정의 함수(UDF)는 ABS()나 CONCAT()와 같은 네이티브(내장) MariaDB 함수처럼 작동하는 새로운 함수를 사용하여 MariaDB를 확장하는 방법입니다.
UDF는 C, C++ 또는 C 콜규칙을 사용하는 다른 언어로 작성해야 하며 MariaDB는 동적으로 컴파일되어야 하며 운영시스템은 동적 로드를 지원해야 합니다.
Microsoft SQL Server는 MySQL/MariaDB의 Stored Function과 같은 용도로 UDF를 사용합니다.이것이 혼란의 원인일 수 있습니다.
언급URL : https://stackoverflow.com/questions/64161662/user-defined-function-in-generated-column-definition-in-mariadb
'programing' 카테고리의 다른 글
yield()의 주요 용도는 무엇이며 join() 및 interrupt()와는 어떻게 다릅니까? (0) | 2022.10.08 |
---|---|
사전을 JSON으로 변환하는 중 (0) | 2022.10.08 |
인쇄용 if 스테이트먼트를 인라인으로 쓰는 방법 (0) | 2022.10.08 |
Python에서 현재 OS를 찾으려면 어떻게 해야 하나요? (0) | 2022.10.08 |
python에서 목록 항목 집합을 구성하는 방법은 무엇입니까? (0) | 2022.10.08 |