MySQL能否创建接收JSON参数的函数?PostgreSQL转MySQL迁移需求
MySQL支持接收JSON参数的函数吗?(附PostgreSQL迁移示例)
我需要将PostgreSQL数据库迁移到MySQL,其中存在大量接收JSON参数的函数,想了解MySQL是否可以实现类似PostgreSQL的这类函数,以下是PostgreSQL中的示例代码:
CREATE OR REPLACE FUNCTION fn_crud_sls_quotation_concept_types (data json) RETURNS boolean LANGUAGE 'plpgsql' AS $$ DECLARE "vType" integer := data ->> 'type'; "vId" bigint := data ->> 'id'; "vDescription" varchar := data ->> 'description'; "vStatus" integer := data ->> 'status'; "vUserId" integer := data ->> 'userId'; BEGIN IF "vType" = 1 THEN -- Data Insert INSERT INTO tbl_sls_quotation_concept_types(description, status, "createdBy") VALUES("vDescription", "vStatus", "vUserId"); RETURN TRUE; ELSIF "vType" = 2 THEN -- Data Update UPDATE tbl_sls_quotation_concept_types SET "description" = "vDescription", "status" = "vStatus", "updatedBy" = "vUserId", "updatedAt" = current_timestamp WHERE id = "vId"; RETURN TRUE; ELSIF "vType" = 3 THEN -- Data Delete UPDATE tbl_sls_quotation_concept_types SET status = 0 , "updatedBy" = "vUserId", "updatedAt" = current_timestamp WHERE id = "vId" ; RETURN TRUE; END IF; END; $$;
答案:MySQL完全支持这类场景
MySQL 5.7及以上版本原生支持JSON类型,也可以创建接收JSON参数的自定义函数,以下是对应上述PostgreSQL函数的MySQL实现:
DELIMITER // CREATE FUNCTION fn_crud_sls_quotation_concept_types(data JSON) RETURNS BOOLEAN DETERMINISTIC BEGIN DECLARE vType INT; DECLARE vId BIGINT; DECLARE vDescription VARCHAR(255); DECLARE vStatus INT; DECLARE vUserId INT; -- 提取JSON参数值(MySQL支持->>运算符,和PostgreSQL用法一致) SET vType = data->>'$.type'; SET vId = data->>'$.id'; SET vDescription = data->>'$.description'; SET vStatus = data->>'$.status'; SET vUserId = data->>'$.userId'; IF vType = 1 THEN -- 插入数据 INSERT INTO tbl_sls_quotation_concept_types(description, status, createdBy) VALUES(vDescription, vStatus, vUserId); RETURN TRUE; ELSIF vType = 2 THEN -- 更新数据 UPDATE tbl_sls_quotation_concept_types SET description = vDescription, status = vStatus, updatedBy = vUserId, updatedAt = CURRENT_TIMESTAMP WHERE id = vId; RETURN TRUE; ELSIF vType = 3 THEN -- 逻辑删除数据 UPDATE tbl_sls_quotation_concept_types SET status = 0, updatedBy = vUserId, updatedAt = CURRENT_TIMESTAMP WHERE id = vId; RETURN TRUE; END IF; RETURN FALSE; -- 处理未匹配的type值 END // DELIMITER ;
关键差异说明
- JSON参数提取:MySQL支持
->>运算符,和PostgreSQL用法完全一致,用于提取JSON字段并自动去除字符串引号;也可以用JSON_UNQUOTE(JSON_EXTRACT(data, '$.type'))实现相同效果。 - 函数语法:MySQL函数需要用
DELIMITER临时修改语句分隔符,避免函数体中的分号被提前解析;函数定义不需要用$$包裹,直接用BEGIN...END。 - 标识符引用:MySQL默认使用反引号``包裹特殊标识符,若开启
ANSI_QUOTES模式也可使用双引号,示例中去掉了不必要的引号以符合MySQL常规写法。 - 返回值处理:新增了默认返回
FALSE的逻辑,避免未匹配type值时无返回值的问题。
内容的提问来源于stack exchange,提问作者Felipe Renovato
相关产品推荐
相关产品推荐

