first commit
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
DELIMITER $$
|
||||
|
||||
CREATE OR REPLACE PROCEDURE usp_parsejson (
|
||||
IN _uuid VARCHAR(100),
|
||||
IN _json TEXT
|
||||
)
|
||||
/*
|
||||
CALL usp_parsejson('1234', '{ "id":"abc", "nmae": "Michael"}');
|
||||
SELECT * from _jsondata WHERE guid = '1234';
|
||||
|
||||
DELETE FROM _jsondata WHERE guid = '1234';
|
||||
*/
|
||||
BEGIN
|
||||
DECLARE _json_clean TEXT;
|
||||
DECLARE _pair TEXT;
|
||||
DECLARE _key VARCHAR(255);
|
||||
DECLARE _value TEXT;
|
||||
DECLARE _valuetype VARCHAR(20);
|
||||
DECLARE _pos INT DEFAULT 1;
|
||||
DECLARE _len INT;
|
||||
DECLARE _curr INT DEFAULT 1;
|
||||
DECLARE _next INT;
|
||||
DECLARE _cnt INT DEFAULT 1;
|
||||
|
||||
-- 建立暫存表
|
||||
CREATE TEMPORARY TABLE IF NOT EXISTS _jsondata (
|
||||
guid VARCHAR(100),
|
||||
rowid INT,
|
||||
fieldname VARCHAR(255),
|
||||
contents TEXT,
|
||||
fieldtype VARCHAR(20)
|
||||
);
|
||||
|
||||
-- 清除左右大括號與空白
|
||||
SET _json_clean = REPLACE(_json,'{','');
|
||||
SET _json_clean = REPLACE(_json_clean,'}','');
|
||||
|
||||
-- 計算逗號數(也就是 key:value 數)
|
||||
SET _len = LENGTH(_json_clean) - LENGTH(REPLACE(_json_clean, ',', '')) + 1;
|
||||
|
||||
WHILE _cnt <= _len DO
|
||||
-- 取出第 cnt 個 key:value 配對
|
||||
SET _pair = SUBSTRING_INDEX(SUBSTRING_INDEX(_json_clean, ',', _cnt), ',', -1);
|
||||
|
||||
-- 取出 key
|
||||
SET _key = SUBSTRING_INDEX(_pair, ':', 1);
|
||||
SET _key = REPLACE(TRIM(_key),'"','');
|
||||
|
||||
-- 取出 value
|
||||
SET _value = SUBSTRING_INDEX(_pair, ':', -1);
|
||||
SET _value = TRIM(_value);
|
||||
|
||||
-- 判斷型別
|
||||
IF LEFT(_value, 1) = '"' AND RIGHT(_value, 1) = '"' THEN
|
||||
SET _valuetype = 'string';
|
||||
SET _value = REPLACE(_value,'"','');
|
||||
ELSE
|
||||
SET _valuetype = 'number';
|
||||
END IF;
|
||||
|
||||
-- 寫入結果
|
||||
INSERT INTO _jsondata (guid, rowid, fieldname, contents, fieldtype)
|
||||
VALUES (_uuid, _cnt, _key, _value, _valuetype);
|
||||
|
||||
-- 下一筆
|
||||
SET _cnt = _cnt + 1;
|
||||
END WHILE;
|
||||
END$$
|
||||
|
||||
DELIMITER ;
|
||||
Reference in New Issue
Block a user