mysql global search procedure

DROP PROCEDURE IF EXISTS findAll;

DELIMITER $$


CREATE PROCEDURE findAll(IN `search` TEXT)

BEGIN

    SET SESSION group_concat_max_len := @@max_allowed_packet;


    SELECT GROUP_CONCAT(

        "SELECT '", c1.TABLE_NAME, "' AS `table`, '", c1.COLUMN_NAME, "' AS `column`, ",

        "CONCAT_WS(',', ",  

            (SELECT GROUP_CONCAT(CONCAT('`', c2.column_name, '`')) 

             FROM `information_schema`.`columns` c2 

             WHERE c1.TABLE_SCHEMA=c2.TABLE_SCHEMA 

               AND c1.TABLE_NAME=c2.TABLE_NAME 

               AND c2.COLUMN_KEY='PRI'), 

        ") AS pri, ",

        "CONVERT(`", c1.COLUMN_NAME, "` USING utf8mb4) COLLATE utf8mb4_general_ci AS value FROM `", c1.TABLE_NAME,

        "` WHERE CONVERT(`", c1.COLUMN_NAME, "` USING utf8mb4) COLLATE utf8mb4_general_ci LIKE '%", search, "%'"

        SEPARATOR "\nUNION\n"

    ) INTO @sql

    FROM information_schema.columns c1 

    WHERE c1.TABLE_SCHEMA = DATABASE()

      AND c1.DATA_TYPE IN ('char', 'varchar', 'text', 'tinytext', 'mediumtext', 'longtext');


    -- End the query properly

    SET @sql = CONCAT(@sql, ";");


    -- Debug (optional): SELECT @sql;


    PREPARE stmt FROM @sql;

    EXECUTE stmt;

    DEALLOCATE PREPARE stmt;

END $$


DELIMITER ;


Comments

Popular posts from this blog

Grouping Sets, With Rollup and With Cube example

Adding Page brake aganist group values

To Get All the Names of tables and Databases their data have changed in last 24 Hours And Backup those databases