应用场景:比如在系统的web页面上输入某些值,然后想知道是否正确保存了,但不知道数据是存到哪个表里,除了直接问相关开发人员外,还可以通过运行该查询,来找到数据对应的表以及字段名。
DROP TABLE if EXISTS temp;CREATE TABLE temp(tablename VARCHAR(255),LieName VARCHAR(255));# 将结束符改为//delimiter //DROP procedure IF EXISTS getDataByDbName//# 两个必须的参数:数据库名dbName,字段名ziduanCREATE procedure getDataByDbName(in dbName VARCHAR(255),IN ziduan VARCHAR(255))BEGINDECLARE num INT;SET @STMT =CONCAT("SELECT COUNT(*) FROM ",dbName," WHERE `",ziduan,"` LIKE BINARY '%特定值%' INTO @num;");# 预处理PREPARE STMT FROM @STMT;EXECUTE STMT;IF(@num>0) THENINSERT INTO temp VALUES (dbName,ziduan);END IF;end//delimiter ;delimiter //DROP PROCEDURE IF EXISTS searchAll//CREATE PROCEDURE searchAll()BEGINDECLARE done BOOLEAN DEFAULT 0;DECLARE biao VARCHAR (255);DECLARE ziduan VARCHAR (255);DECLARE indexss CURSORFORSELECT TABLE_NAME,COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='数据库名' ;/*02000代表异常:1.SELECT INTO语句或INSERT语句的子查询的结果为空表。2.在搜索的UPDATE或DELETE语句内标识的行数为零。3.在FETCH语句中引用的游标位置处于结果表最后一行之后。 */DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;OPEN indexss;repeatFETCH indexss INTO biao,ziduan;call getDataByDbName(biao,ziduan);UNTIL done END repeat;CLOSE indexss;end//delimiter ;CALL searchAll();SELECT * FROM temp;
使用时,在查询页面粘贴代码,“特定值”改为待查的字段值,“数据库名”改为对应数据库名称,执行查询就能查到相关信息。