first commit
This commit is contained in:
+168
@@ -0,0 +1,168 @@
|
||||
DELIMITER //
|
||||
|
||||
CREATE OR REPLACE PROCEDURE Parse_JSON(
|
||||
IN p_uuid VARCHAR(100),
|
||||
IN json_input JSON
|
||||
)
|
||||
/*
|
||||
call Parse_JSON('uuid-20250803',
|
||||
'{"custcateid":"08","custcatecname":"8888","custcateename":"","memochar":"","mergetype":"","token":"c975931c-6f8d-11f0-9c5f-d8bbc15c1404","_$_tableName":"bascustcategory",
|
||||
"_$_pk":"custcateid",
|
||||
"_$_action":"D"}');
|
||||
|
||||
call Parse_JSON('uuid-20250803',
|
||||
'{"sprintid":"Next-Sprint","sprint_title":"調整現行 PBI 緩衝用的 Sprint(2025)","sprint_startdate":"2025-01-01T00:00:00.000+08:00","sprint_enddate":"2099-12-30T16:00:00.000Z","time_range":"2099",
|
||||
"token":"768f1c89-6fb9-11f0-9c5f-d8bbc15c1404",
|
||||
"_$_tableName":"pms_sprint",
|
||||
"_$_pk":"sprintid",
|
||||
"_$_action":"U"}');
|
||||
|
||||
call Parse_JSON('uuid-20250803_3',
|
||||
'{"rows":[{"custcateid":"09","custcatecname":"9999","custcateename":"9999-memo","memochar":"","mergetype":""}],
|
||||
"rowsDiff":[{"custcateename":"9999-memo"}],"indexes":["7"],
|
||||
"rowsOrigin":
|
||||
[{"custcateid":"09","custcatecname":"9999","custcateename":"","memochar":"","mergetype":""}],
|
||||
"unModifiedItems":[
|
||||
{"custcateid":"01","custcatecname":"經銷商","custcateename":"333","memochar":"","mergetype":"0"},
|
||||
{"custcateid":"02","custcatecname":"代理商","custcateename":"444","memochar":"","mergetype":"0"},
|
||||
{"custcateid":"03","custcatecname":"大型企業","custcateename":"","memochar":"","mergetype":"0"},
|
||||
{"custcateid":"04","custcatecname":"政府","custcateename":"","memochar":"","mergetype":"0"},
|
||||
{"custcateid":"05","custcatecname":"中小企業","custcateename":"","memochar":"","mergetype":"0"},
|
||||
{"custcateid":"06","custcatecname":"學校","custcateename":"","memochar":"","mergetype":"0"},
|
||||
{"custcateid":"07","custcatecname":"竹科","custcateename":"","memochar":"","mergetype":"0"}],
|
||||
"token":"d101363e-700c-11f0-9c5f-d8bbc15c1404","_$_tableName":"bascustcategory","_$_pk":"custcateid","_$_action":"U"}');
|
||||
|
||||
call Parse_JSON('uuid-20250820_1',
|
||||
'{"projectclassid":"soft-dev","proj_boss":"120102",
|
||||
"config":[{"label":"(GM) 總經理室",
|
||||
"children":[
|
||||
{"label":"(120101) 高光","value":"120101"},
|
||||
{"label":"(121108) 沈秋月","value":"121108"},
|
||||
{"label":"(200605) 陳明文","value":"200605"},
|
||||
{"label":"(120102) 王俊傑","value":"120102"},
|
||||
{"label":"(150201) 衛斯理","value":"150201"},
|
||||
{"label":"(190802) 葉子龍","value":"190802"},
|
||||
{"label":"(210301) 高國華","value":"210301"},
|
||||
{"label":"(admin)admin","value":"admin"},
|
||||
{"label":"(160805) 邱雅惠","value":"160805"},
|
||||
{"label":"(170911) 劉強南","value":"170911"},
|
||||
{"label":"(201001) 林志堅","value":"201001"},
|
||||
{"label":"(120912) 陳進德","value":"120912"},
|
||||
{"label":"(170109) 林玉玲","value":"170109"},
|
||||
{"label":"(180210) 秦一明","value":"180210"},
|
||||
{"label":"(191006) 歐陽龍","value":"191006"},
|
||||
{"label":"(201036) 邱郁芳","value":"201036"},
|
||||
{"label":"(demo) 測試用戶","value":"demo"}]
|
||||
}],
|
||||
"projectid":"IT-2025-Chaos","proj_cname":"MariaDB改寫專案","proj_status":"SASD","proj_startdate":"2025-08-01","proj_enddate":"2025-09-30",
|
||||
"proj_year":"2025","token":"a85afca2-7dc5-11f0-9c5f-d8bbc15c1404",
|
||||
"_$_tableName":"pmsproject",
|
||||
"_$_pk":"projectid",
|
||||
"_$_action":"C"}');
|
||||
|
||||
|
||||
*/
|
||||
BEGIN
|
||||
DECLARE i INT DEFAULT 0;
|
||||
DECLARE total_keys INT;
|
||||
DECLARE key_name VARCHAR(255);
|
||||
DECLARE val JSON;
|
||||
|
||||
DECLARE sub_key_name VARCHAR(255);
|
||||
DECLARE sub_val JSON;
|
||||
DECLARE sub_total_keys INT;
|
||||
DECLARE j INT;
|
||||
DECLARE x INT;
|
||||
DECLARE y INT;
|
||||
DECLARE arr_count,arr_idx INT;
|
||||
DECLARE arr_obj JSON;
|
||||
|
||||
-- 取第一層 keys 數量
|
||||
SET total_keys = JSON_LENGTH(JSON_KEYS(json_input));
|
||||
SET x = 1;
|
||||
SET y = 1;
|
||||
|
||||
WHILE i < total_keys DO
|
||||
SET key_name = JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(json_input), CONCAT('$[', i, ']')));
|
||||
SET val = JSON_EXTRACT(json_input, CONCAT('$.', key_name));
|
||||
|
||||
-- 插入第一層
|
||||
-- INSERT INTO tmp_json_parse_result (level, parent_key, key_name, value)
|
||||
INSERT INTO sys_jsondata (UUID, `NAME`, SequenceNo, parent_ID, StringValue, ValueType)
|
||||
VALUES (p_uuid, key_name, x, NULL, JSON_UNQUOTE(val), JSON_TYPE(val));
|
||||
|
||||
SET y = x;
|
||||
SET x = x + 1;
|
||||
|
||||
-- 第二層處理:若 value 是 object 或 array,解析其 key-value (當前版本只處理 2層, 多的暫時不管)
|
||||
IF JSON_TYPE(val) IN ('OBJECT', 'ARRAY') THEN
|
||||
-- 先處理 ARRAY 可能有多筆資料
|
||||
IF JSON_TYPE(val) = 'ARRAY' THEN
|
||||
SET arr_count = JSON_LENGTH(val);
|
||||
SET arr_idx = 0;
|
||||
|
||||
WHILE arr_idx < arr_count DO
|
||||
-- 取出陣列中的單一物件
|
||||
SET arr_obj = JSON_EXTRACT(val, CONCAT('$[', arr_idx, ']'));
|
||||
SET j = 0;
|
||||
SET sub_total_keys = JSON_LENGTH(JSON_KEYS(arr_obj));
|
||||
|
||||
WHILE j < sub_total_keys DO
|
||||
SET sub_key_name = JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(arr_obj), CONCAT('$[', j, ']')));
|
||||
SET sub_val = JSON_EXTRACT(arr_obj, CONCAT('$.', sub_key_name));
|
||||
|
||||
INSERT INTO sys_jsondata (UUID, `NAME`, SequenceNo, parent_ID, Object_ID, StringValue, ValueType)
|
||||
VALUES (p_uuid, sub_key_name, x, y, arr_idx+1, JSON_UNQUOTE(sub_val), JSON_TYPE(sub_val));
|
||||
|
||||
SET j = j + 1;
|
||||
SET x = x + 1;
|
||||
END WHILE;
|
||||
|
||||
SET arr_idx = arr_idx + 1;
|
||||
END WHILE;
|
||||
ELSE
|
||||
-- 處理單一 OBJECT
|
||||
SET j = 0;
|
||||
SET sub_total_keys = JSON_LENGTH(JSON_KEYS(val));
|
||||
|
||||
WHILE j < sub_total_keys DO
|
||||
SET sub_key_name = JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(val), CONCAT('$[', j, ']')));
|
||||
SET sub_val = JSON_EXTRACT(val, CONCAT('$.', sub_key_name));
|
||||
|
||||
INSERT INTO sys_jsondata (UUID, `NAME`, SequenceNo, parent_ID, StringValue, ValueType)
|
||||
VALUES (p_uuid, sub_key_name, x, y, JSON_UNQUOTE(sub_val), JSON_TYPE(sub_val));
|
||||
|
||||
SET j = j + 1;
|
||||
SET x = x + 1;
|
||||
END WHILE;
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
/*
|
||||
-- 第二層處理:若 value 是 object,解析其 key-value
|
||||
IF JSON_TYPE(val) in ('OBJECT','ARRAY') THEN
|
||||
-- 先解決 rows Grid Edit 多筆資料, 後續應該還有其他狀況要一一排除
|
||||
SET j = 0;
|
||||
-- IF SELECT TRIM(BOTH '[]' FROM '[example]') AS result;
|
||||
SET sub_total_keys = JSON_LENGTH(JSON_KEYS(val));
|
||||
|
||||
WHILE j < sub_total_keys DO
|
||||
SET sub_key_name = JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(val), CONCAT('$[', j, ']')));
|
||||
SET sub_val = JSON_EXTRACT(val, CONCAT('$.', sub_key_name));
|
||||
|
||||
-- INSERT INTO tmp_json_parse_result (level, parent_key, key_name, value)
|
||||
INSERT INTO sys_jsondata (UUID, `NAME`, SequenceNo, parent_ID, StringValue, ValueType)
|
||||
VALUES (p_uuid, sub_key_name, x, y , JSON_UNQUOTE(sub_val), JSON_TYPE(val));
|
||||
|
||||
SET j = j + 1;
|
||||
SET x = x + 1;
|
||||
END WHILE;
|
||||
END IF;
|
||||
*/
|
||||
|
||||
SET i = i + 1;
|
||||
END WHILE;
|
||||
|
||||
END //
|
||||
|
||||
DELIMITER ;
|
||||
Reference in New Issue
Block a user