[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 ;

댓글

이 블로그의 인기 게시물

[유니티] 오류 사례 "Moving file failed", "Temp"

[유니티 사례] 비주얼 스튜디오(Visual Studio) 실행 오류

[유니티] 구글 지도 출력 샘플