Mysql存储过程全库搜索

这篇博客介绍了如何通过创建MySQL存储过程来实现对数据库中所有表的指定字符串搜索。首先定义变量和游标,然后遍历信息表获取表名,再通过CONCAT_WS函数将表数据拼接为字符串进行查询。最后使用UNION ALL将各表查询结果合并,一次性执行全部SQL。此外,还提供了一个Java代码示例,演示了读取SQL文件并逐行搜索特定字符串的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录一次对Mysql数据库 库内指定字符串搜索

实现方法:对所有表,拼接表的一行数据成一个字符串,对行数据进行查询,对每张表的查询结果用UNION ALL拼接。

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_name`()
BEGIN
#想要一次性处理表的数量
DECLARE tableCount int DEFAULT 1500;
#库里符合条件表的数量
DECLARE realTableCount int DEFAULT 0;
#游标状态,跳出循环用
DECLARE curosrFlag int DEFAULT 0;
#表名
DECLARE tableName VARCHAR(100);
#表的所有列
DECLARE columnNames VARCHAR(3000);
#单表sql
DECLARE selectSql VARCHAR(3000);
#单表sql模板
DECLARE selectSqlTemp VARCHAR(3000);
#全部表sql加 UNION ALL 拼接
DECLARE totalSql MEDIUMTEXT;
#表名游标
DECLARE tableNameCurosr 
CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'my_db' AND TABLE_NAME NOT IN (SELECT table_name FROM aa_url)
AND TABLE_NAME NOT IN ('aa_url');

SELECT COUNT(*) INTO realTableCount FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'my_db' AND TABLE_NAME NOT IN (SELECT table_name FROM aa_url)
AND TABLE_NAME NOT IN ('aa_url');

# 取 Min(realTableCount, tableCount)
IF realTableCount < tableCount THEN
	SET tableCount = realTableCount;
END IF;

SET selectSqlTemp = 
"
SELECT * FROM
(
	SELECT '{tableName1}' AS table_name, CONCAT_WS({columnNames1}) str
	FROM {tableName1}
) t1
WHERE t1.str LIKE '%http://118%'
";

SET totalSql = '';

IF tableCount > 0 THEN 

	# 打开游标
	OPEN tableNameCurosr;

		WHILE curosrFlag < tableCount DO
			SET curosrFlag= 1 + curosrFlag;
			
			FETCH tableNameCurosr INTO tableName;
			SELECT GROUP_CONCAT(COLUMN_NAME SEPARATOR ",") INTO columnNames FROM information_schema.COLUMNS
			WHERE TABLE_SCHEMA = 'my_db' AND TABLE_NAME = tableName;
			SET columnNames = CONCAT('"#",', columnNames);
			# 拼接要执行的单表的sql
			SET selectSql = selectSqlTemp;
			SET selectSql = REPLACE(selectSql,"{tableName1}",tableName);
			SET selectSql = REPLACE(selectSql,"{columnNames1}",columnNames);
			# 拼接全部表sql
			SET totalSql = CONCAT(totalSql, selectSql);
			IF curosrFlag < tableCount THEN
				SET totalSql = CONCAT(totalSql, " UNION ALL ");
			END IF;
			# 记录已经查询过的表
			INSERT INTO aa_url(table_name, row_value) VALUES(tableName, selectSql);
			#PREPARE exeSql FROM @selectSql;
			#EXECUTE exeSql;
		END WHILE;
		SET @totalSql = totalSql;
		# 执行全部表sql
		PREPARE tSql FROM @totalSql;
		EXECUTE tSql;
		DEALLOCATE PREPARE tSql;
	# 关闭游标
	CLOSE tableNameCurosr;
END IF;

END

如果你要这样👇把数据库转成sql,用readLine去匹配,我也没有办法

    public static void main(String[] args) throws IOException {
        File sql = new File("D:/mydb.sql");
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(sql)));
        String line = "";
        int i = 1;
        while((line = br.readLine())!=null){
            if (line.contains("http://118.")) {
                i++;
                System.out.println(line);
            }
        }
        br.close();
        System.out.println(i);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值