카테고리 없음

Query를 JSON형태로 출력하는 GET_JSON_RESULT 프로시저

EGTools 2025. 1. 18. 09:30
728x90

외부에서 Query를 호출하여 배열형태로 받아서 처리하는데,

보고서 라이브러리에서 JSON 형태 출력을 그대로 데이터 소스로 사용하는 게 있어서 

사용에 필요하지 않을까해 ChatGPT 도움으로 작성한 프로시저입니다.

QueryToJSON 처럼 이름을 짓는게 나을지 모르겠네요.

 

필드명 분석의 한계 때문에  select * form table_name 형태의 Query문은 사용할 수 없습니다.

GET_JSON_FIELDS함수를 좀 더 확장하면 가능할 듯 하지만 제가 사용하는 데는 문제가 없으므로 그냥 갑니다.

 

JSON출력은 "header"와 "body"로 나뉘어 header에 결과와 출력행수, body에 query결과를 담도록 했습니다.

DELIMITER $$

DROP PROCEDURE IF EXISTS GET_JSON_RESULT;

CREATE PROCEDURE GET_JSON_RESULT (
    IN in_query TEXT
)
BEGIN

    -- 2025-01-17, EGTOOLS
    -- 이 프로시저는 in_query로 실행할 Query문을 받아서 실행후 결과를 JSON으로 출력함
    -- Query문의 Select이 "Seclect * FROM table_name" 처럼 *를 사용시 사용할 수 없음

    -- 필요한 변수 초기화
    DECLARE status VARCHAR(10) DEFAULT 'success';
    DECLARE exit_handler_called INT DEFAULT 0;
    DECLARE field_names TEXT;
    DECLARE json_query TEXT;
    DECLARE json_header TEXT;

    -- 오류 핸들러 설정
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
        SET status = 'error';
        SET exit_handler_called = 1;
    END;

    -- 필드명 동적으로 추출
    SET field_names = GET_JSON_FIELDS(in_query);
    
    -- 동적Query는 프로시저에서 사용할 수 있으며, Local @변수에 대입 가능
    SET json_query = CONCAT(
        'SELECT JSON_ARRAYAGG(JSON_OBJECT(', field_names, ')) INTO @json_body ',
        'FROM (', in_query, ') AS temp_table'
    );

    -- JSON 변환 쿼리 실행
    PREPARE stmt_json FROM json_query;
    EXECUTE stmt_json;
    DEALLOCATE PREPARE stmt_json;

    -- 오류에 따라 status에 표시하고, 전체 행수와 목록을 body에 나열
    IF exit_handler_called = 0 THEN
        -- @json_body 전체 행수 가져오기
        SELECT JSON_LENGTH(@json_body) INTO @total_lines;
    
        -- JSON Header 작성
        SET json_header = JSON_OBJECT('status', status,'total_lines', @total_lines);
        -- header와 body를 가진 JSON 출력;
        SELECT CONCAT('{{\"header\": ', json_header, '}, {\"body\":', @json_body, '}}');
    ELSE
        -- 오류 발생 시 에러 메시지만 반환
        SET json_header = JSON_OBJECT('status', status,'total_lines', 0);
        SELECT CONCAT('{{\"header\": ', json_header, '}, {\"body\":[]}}');
    END IF;    
    
END$$

DELIMITER ;
728x90