DELIMITER // CREATE OR REPLACE PROCEDURE orm_exec_update_v2( IN p_tablename VARCHAR(200), -- 表名 IN p_pk VARCHAR(100), -- 主键(用于更新/删除) IN p_action VARCHAR(20), -- CRUDP操作 IN p_uuid VARCHAR(100), -- UUID标识 IN p_userid VARCHAR(100) -- 用户ID ) /* 功能: orm_api_v2 [更新]的核心程序,智能构建相应SQL 描述: 用于更新操作的ORM核心逻辑 创建日期: 2023/12/16 MariaDB转换版本 */ BEGIN DECLARE v_maxcount, v_rec INT; DECLARE v_currid INT; DECLARE v_cnt INT; DECLARE v_un_field VARCHAR(100); DECLARE v_ud_field VARCHAR(100); -- 步骤1: 获取最小parent_id (rows) SELECT MIN(parent_id) INTO v_maxcount FROM orm_json_tmp WHERE uuid = p_uuid; -- AND valuetype in ('ARRAY','object'); -- 取得欲更新筆數 SELECT MAX(object_id) INTO v_rec FROM orm_json_tmp WHERE uuid = p_uuid AND parent_id = v_maxcount; -- 步骤2: 更新/插入update_user和update_date字段 SET v_un_field = 'update_user'; SET v_ud_field = 'update_date'; -- 检查update_user字段是否存在 SELECT COUNT(*) INTO v_cnt FROM information_schema.columns WHERE table_name = p_tablename AND column_name = v_un_field; IF v_cnt > 0 THEN SELECT COUNT(*) INTO v_cnt FROM orm_json_tmp WHERE uuid = p_uuid AND json_key = v_un_field; IF v_cnt = 0 THEN INSERT INTO orm_json_tmp (uuid, parent_id, json_key, json_value, ValueType) VALUES (p_uuid, v_maxcount, v_un_field, p_userid, 'string'); ELSE UPDATE orm_json_tmp SET json_value = p_userid WHERE uuid = p_uuid AND json_key = v_un_field; END IF; END IF; -- 检查update_date字段是否存在 SELECT COUNT(*) INTO v_cnt FROM information_schema.columns WHERE table_name = p_tablename AND column_name = v_ud_field; IF v_cnt > 0 THEN SELECT COUNT(*) INTO v_cnt FROM orm_json_tmp WHERE uuid = p_uuid AND json_key = v_ud_field; IF v_cnt = 0 THEN INSERT INTO orm_json_tmp (uuid, parent_id, json_key, json_value, ValueType) VALUES (p_uuid, v_maxcount, v_ud_field, DATE_FORMAT(NOW(), '%Y-%m-%d'), 'string'); ELSE UPDATE orm_json_tmp SET json_value = DATE_FORMAT(NOW(), '%Y-%m-%d') WHERE uuid = p_uuid AND json_key = v_ud_field; END IF; END IF; -- 日期欄位要格式化處理(待驗證) UPDATE orm_json_tmp SET json_value = DATE_FORMAT(substr(json_value,1,10), '%Y-%m-%d') WHERE uuid = p_uuid AND json_key in (select column_name from information_schema.columns WHERE table_name = p_tablename and substr(data_type,1,4) = 'date') and json_value is not null; -- 判断是否有多笔资料 IF v_rec > 1 THEN -- v_maxcount SET v_currid = 1; WHILE v_currid <= v_rec DO -- 执行核心程序 CALL orm_api_kernel_v2(p_tablename, p_pk, p_action, p_uuid, v_maxcount*1000 + v_currid); -- 取得下一笔资料 SET v_currid = v_currid + 1; END WHILE; ELSE -- 單筆資料傳入 CALL orm_api_kernel_v2(p_tablename, p_pk, p_action, p_uuid, 1); END IF; END // DELIMITER ;