JSON representation of row

from the Artful MySQL Tips List


Posted on a MySQL forum by Fernando Paiva (needs MySQL 8.0) ...
drop procedure if exists row_to_json;
delimiter go
CREATE PROCEDURE row_to_json(
  IN _schema varchar(255), IN _table varchar(255), IN _filter text
) SQL SECURITY INVOKER
BEGIN
    DECLARE handler_code TEXT;
    DECLARE handler_msg text;
    DECLARE handler_errorNo text;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION 
      BEGIN
        GET DIAGNOSTICS CONDITION 1
        handler_code = RETURNED_SQLSTATE,
        handler_msg = MESSAGE_TEXT,
        handler_errorNo = MYSQL_ERRNO;
        SELECT JSON_OBJECT('code', handler_code, 'error_number', handler_errorNo, 'message', handler_msg);
      END;
    DROP TEMPORARY TABLE IF EXISTS temp_row_to_json;
    CREATE TEMPORARY TABLE temp_row_to_json (jsonrow TEXT);
    SELECT CONCAT('INSERT INTO temp_row_to_json SELECT JSON_OBJECT(', GROUP_CONCAT('''', columnName, ''', ', columnName), ') FROM ', _schema, '.', _table,
        (IF(ISNULL(_filter), '', CONCAT(' WHERE ', _filter)))) 
    INTO @query
    FROM (
      SELECT COLUMN_NAME AS columnName
      FROM information_schema.COLUMNS
      WHERE (COLUMNS.TABLE_SCHEMA = _schema)
        AND (COLUMNS.TABLE_NAME = _table)
    ) AS columns;
    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    SELECT COUNT(*) 
    INTO @rowCount
    FROM temp_row_to_json;
    IF (@rowCount > 1) THEN
        SELECT JSON_OBJECT(CONCAT(_schema, '.', _table), JSON_ARRAYAGG(CAST(jsonrow AS JSON))) AS 'json'
        FROM temp_row_to_json;
    ELSE
        SELECT jsonrow AS `json`
        FROM temp_row_to_json;
    END IF;
END;
go
delimiter ;

Last updated 11 Jun 2024


Return to the Artful MySQL Tips page