Files
Omni_wizard.db/tools/gf_trans_json_v7.txt
T
2026-02-06 14:44:08 +08:00

61 lines
1.8 KiB
Plaintext

DELIMITER //
CREATE OR REPLACE FUNCTION `gf_trans_json_v7` (
p_source TEXT,
p_actions VARCHAR(1) -- C(reate) 或 U(pdate)
)
/*
function : 將 amis 傳入的字串, 轉為標準 json 格式後回傳給 orm_api(配合 mariadb)
修改自 gf_trans_json(已不使用)
description: 呼叫範例 SELECT gf_trans_json_v7('xxxx', 'C');
build date : 2021/09/26
modify history
item who date modify docs
==== ========== ========== ================================================
1 michael 2021/09/26 新增
2 [改寫者] 2023/11/15 改寫為 MariaDB 版本並最佳化
*/
RETURNS TEXT
DETERMINISTIC
BEGIN
DECLARE v_max INT;
DECLARE v_now INT;
DECLARE v_rets TEXT;
DECLARE v_rows_pos INT;
DECLARE v_rows_diff_pos INT;
IF p_actions = 'C' THEN
SET v_rets = SUBSTRING(p_source, 2, CHAR_LENGTH(p_source) - 1);
-- step1: 先移除數字鍵 (最佳化:使用迴圈而非逐次檢查)
SET v_now = 0;
WHILE v_now <= 1000 DO
IF INSTR(v_rets, CONCAT('"', v_now, '":')) > 0 THEN
SET v_rets = REPLACE(v_rets, CONCAT('"', v_now, '":'), '');
END IF;
SET v_now = v_now + 1;
END WHILE;
-- 移除結尾多餘的 } 字符
IF RIGHT(v_rets, 2) = '}}' THEN
SET v_rets = LEFT(v_rets, CHAR_LENGTH(v_rets) - 1);
END IF;
SET v_rets = CONCAT('{[', v_rets, ']}');
ELSEIF p_actions = 'U' THEN
-- 找出 rows 和 rowsDiff 的位置
SET v_rows_pos = INSTR(p_source, '"rows":');
SET v_rows_diff_pos = INSTR(p_source, '"rowsDiff":');
-- 擷取 rows 內容並格式化
SET v_rets = SUBSTRING(p_source, 1, v_rows_diff_pos - 3);
SET v_rets = SUBSTRING(v_rets, v_rows_pos + 8, CHAR_LENGTH(v_rets));
SET v_rets = CONCAT('{[', v_rets, ']}');
END IF;
RETURN v_rets;
END //
DELIMITER ;