在已知功能的情况下,如何快速的获取该功能用到了哪些表,从数据库中遍历并展示出来,通常是要怎么做呢?网上查阅,使用存储过程来实现循环遍历,列出库中的位置,记录下来,方便备查。
存储过程输入参数如下所示。
输入参数 | 中文名称
——– | —–
para_databasename | 数据库名称
para_finstr | 查询的字符串
存储过程主体
DELIMITER //
-- 判断存储过程是否存在
DROP PROCEDURE IF EXISTS `search_string`;
CREATE PROCEDURE `search_string`
IN para_databasename VARCHAR(128),
IN para_finstr VARCHAR(128)
BEGIN
-- 定义接收游标数据的变量
DECLARE tmp_dbname VARCHAR(128);
DECLARE tmp_tbname VARCHAR(128);
DECLARE tmp_colname VARCHAR(128);
-- 遍历数据结束标志
DECLARE done INT DEFAULT FALSE;
-- 定义游标
DECLARE cur_db_tb CURSOR
SELECT
#*,
c.table_schema,c.table_name,c.COLUMN_NAME
information_schema.`COLUMNS` C
INNER JOIN information_schema.`TABLES` t ON c.`TABLE_NAME`=t.`TABLE_NAME`
WHERE
T.`TABLE_TYPE`='BASE TABLE'
(c.data_type LIKE '%char%' OR c.data_type LIKE '%text%')
(C.TABLE_SCHEMA=para_databasename OR IFNULL(para_databasename,'') ='')
AND IFNULL(para_finstr,'')<>'';
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 展示的字段:数据库名称 表名称 列名称 出现的次数
CREATE TEMPORARY TABLE IF NOT EXISTS rstb(dbname VARCHAR(128),tbname VARCHAR(128),colname VARCHAR(128),cnt INT);
-- 打开游标
OPEN cur_db_tb;
-- 开始循环
read_loop: LOOP
-- 提取游标里的数据
FETCH cur_db_tb INTO tmp_dbname,tmp_tbname,tmp_colname;
-- 声明结束的时候
IF done THEN
LEAVE read_loop;
END IF;
-- 添加循环的事件
SET @sqlstr=CONCAT('select count(1) into @rn from ',tmp_dbname,'.',tmp_tbname,' where ',tmp_colname,' like ''%',para_finstr,'%''');
PREPARE str FROM @sqlstr;
EXECUTE str;
DEALLOCATE PREPARE str;
IF IFNULL(@rn,0) > 0
INSERT INTO rstb VALUES(tmp_dbname,tmp_tbname,tmp_colname,@rn);
END IF;
END LOOP;
-- 关闭游标
CLOSE cur_db_tb;
SELECT * FROM rstb;
DROP TABLE rstb;
DELIMITER ;
mysql 的 information_schema 表,其实是视图,包含着schemata数据库信息、table表信息、column列信息,statistics索引信息等
调用存储过程
运用call命令,执行存储过程
// 数据库eblog中 查询字符串分享在数据库中的位置
call `search_string` ('eblog','分享');
查询结果如下图所示。
oracle 版本
输入参数如下所示。
输入参数 | 中文名称
——– | —–
pString | 查询的字符串
存储过程主体
CREATE OR REPLACE
procedure search_string(pString in varchar) as
cursor all_tab_cursor is
SELECT table_name,column_name,data_type FROM user_tab_columns
where data_type in ('VARCHAR2','CHAR','NCHAR','NCLOB','NVARCHAR2')
and table_name not like 'RPT_STAT_%'
and table_name not like 'TMP_%'
and table_name not like 'DV%'
and table_name <> 'gh'
and table_name <> 'gjxwbjb'
and table_name <> 'gxfs'
and table_name <> 'rsj'
and table_name in (select table_name from user_tables)
order by table_name;
refAllTab all_tab_cursor%rowtype;
-- 定义变量
sSql varchar(4000);
nCount number;
begin
DBMS_OUTPUT.Enable(4000000);
-- 打开游标
open all_tab_cursor;
-- 循环遍历
fetch all_tab_cursor
into refAllTab;
-- 抛出异常
exit when all_tab_cursor%notfound;
-- 拼接的逻辑
sSql := 'SELECT COUNT(1) FROM ' ||
refAllTab.Table_Name || ' WHERE ' || refAllTab.Column_Name ||
' = ''' || pString || '''';
-- 这里可以输出打印,
-- DBMS_OUTPUT.PUT_LINE(sSql);
execute immediate sSql into nCount;
if nCount > 0 then
DBMS_OUTPUT.PUT_LINE('SELECT * FROM ' || refAllTab.Table_Name || ' WHERE ' ||refAllTab.Column_Name || ' = ''' || pString||'''; -- '||nCount);
end if;
-- 结束循环
end loop;
-- 关闭游标
close all_tab_cursor;
-- 结束
end search_string;
oracle的 user_tab_columns 表,保存了当前用户的表、视图和列等信息,用于oracle获取表结构。
user_tables 可查询当前用户的表
调用存储过程
运用call命令,执行存储过程
// 查询当前用户下 字符串 分享 在数据库中的位置
call `search_string` ('分享');
【1】https://blog.csdn.net/weixin_33816300/article/details/92036599