应用场景:比如在系统的web页面上输入某些值,然后想知道是否正确保存了,但不知道数据是存到哪个表里,除了直接问相关开发人员外,还可以通过运行该查询,来找到数据对应的表以及字段名。
DROP TABLE if EXISTS temp;
CREATE TABLE temp(tablename VARCHAR(255),LieName VARCHAR(255));
# 将结束符改为//
delimiter //
DROP procedure IF EXISTS getDataByDbName//
# 两个必须的参数:数据库名dbName,字段名ziduan
CREATE procedure getDataByDbName(in dbName VARCHAR(255),IN ziduan VARCHAR(255))
BEGIN
DECLARE num INT;
SET @STMT =CONCAT("SELECT COUNT(*) FROM ",dbName,
" WHERE `",ziduan,"` LIKE BINARY '%特定值%' INTO @num;");
# 预处理
PREPARE STMT FROM @STMT;
EXECUTE STMT;
IF(@num>0) THEN
INSERT INTO temp VALUES (dbName,ziduan);
END IF;
end//
delimiter ;
delimiter //
DROP PROCEDURE IF EXISTS searchAll//
CREATE PROCEDURE searchAll()
BEGIN
DECLARE done BOOLEAN DEFAULT 0;
DECLARE biao VARCHAR (255);
DECLARE ziduan VARCHAR (255);
DECLARE indexss CURSOR
FOR
SELECT 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;
repeat
FETCH indexss INTO biao,ziduan;
call getDataByDbName(biao,ziduan);
UNTIL done END repeat;
CLOSE indexss;
end//
delimiter ;
CALL searchAll();
SELECT * FROM temp;
使用时,在查询页面粘贴代码,“特定值”改为待查的字段值,“数据库名”改为对应数据库名称,执行查询就能查到相关信息。