[SQL] MySQL, JSON 순차 검색 key, value 값 기준 데이터 생성 PROCEDURE
[SQL] MySQL, JSON 순차 검색 key, value 값 기준 데이터 생성 PROCEDURE
- MySQL에서 JSON함수 중 키와 값을 순차검색으로 받아오는 함수는 없는 것 같아 모든 데이터를 순차검색하여 키와 값을 기준으로 데이터를 생성하는 프로시저 함수 구현
- JSON파일 형식을 변경하여(키를 값에 넣음) 작업 할 수 있지만 형식을 유지하면서 구현함
- JSON파일 형태는 '{"1-2":"102.0", "1-3":"103.0","1-4":"104.0"}';
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | DELIMITER $$ CREATE PROCEDURE OnOrdersInsertSP3(IN _nRaceID INT(4) ) BEGIN -- 예외가 발생 한다면 롤백 해라 -- DECLARE EXIT HANDLER FOR SQLEXCEPTION -- ROLLBACK; -- 트렌잭션 -- START TRANSACTION; -- 변수 선언 DECLARE cTextWinRates TEXT; DECLARE cTicketName TEXT; DECLARE cTicketQuantity TEXT; DECLARE nAddTextLen INT(4) DEFAULT 0; DECLARE nIndex INT(4) DEFAULT 1; -- SELECT userid FROM user WHERE user_type = 1; -- win_rate 테이블에서 마지막에 추가 된 win_idex 컬럼 중 -- nRaceID와 같은 레코드에서 win_rates 컬럼을 cTextWinRates에 저장. SELECT win_rates INTO cTextWinRates FROM win_rate WHERE win_idex = (SELECT MAX(win_idex) FROM win_rate WHERE race_index = _nRaceID); -- 중괄호 제거 , ex) '{"1-2":"102.0" -> "1-2":"102.0" SET cTextWinRates= SUBSTRING(cTextWinRates, 2, LENGTH(cTextWinRates)-2); -- cTextWinRates 데이터를 파싱 ex) SET @j = '{"1-2":"102.0", "1-3":"103.0","1-4":"104.0"}'; -- 첫번째 데이터 '{' 빼고 앞에서 : 기준 분리하여 저장, ex) '{"1-2":"102.0" -> "1-2":"102.0" SET cTicketName = SUBSTRING_INDEX( SUBSTRING_INDEX(cTextWinRates, ',', nIndex), ':', 1); -- 두번째 데이터는 : 기준으로 뒤에서 부터 검색하여 분리 SET cTicketQuantity = SUBSTRING_INDEX( SUBSTRING_INDEX(cTextWinRates, ',', nIndex), ':', -1); -- 해당 데이터를 orders테이블에 insert INSERT INTO orders(user_id, race_id, ticket_name, ticket_quantity) VALUES(nIndex, _nRaceID, cTicketName, cTicketQuantity); -- 두번째 부터는 반복 WHILE nAddTextLen < LENGTH(cTextWinRates) DO SET nIndex = nIndex + 1; SET nAddTextLen = nAddTextLen + LENGTH(SUBSTRING_INDEX(@j, ',', 8)); -- 뒤에서 한번 더 ,를 기준으로 끊고 앞에서 데이터를 검색 한다. SET cTicketName = SUBSTRING_INDEX( SUBSTRING_INDEX( SUBSTRING_INDEX(cTextWinRates, ',', nIndex), ',', -1), ':', 1); SET cTicketQuantity = SUBSTRING_INDEX( SUBSTRING_INDEX(cTextWinRates, ',', nIndex), ':', -1); INSERT INTO orders(user_id, race_id, ticket_name, ticket_quantity) VALUES(nIndex, _nRaceID, cTicketName, cTicketQuantity); END WHILE; -- 이상 없다면 컴잇 하여라 -- COMMIT; END $$ DELIMITER ; |
댓글
댓글 쓰기