You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:24:26