61 lines
1.8 KiB
Plaintext
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 ; |