全库查询某个指定的值或字段(mysql oracle)

在已知功能的情况下,如何快速的获取该功能用到了哪些表,从数据库中遍历并展示出来,通常是要怎么做呢?网上查阅,使用存储过程来实现循环遍历,列出库中的位置,记录下来,方便备查。

mysql版本

存储过程输入参数如下所示。

输入参数中文名称
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 
 FOR 
 SELECT  
  #*,
  c.table_schema,c.table_name,c.COLUMN_NAME
 FROM 
  information_schema.`COLUMNS` C
  INNER JOIN information_schema.`TABLES` t ON c.`TABLE_NAME`=t.`TABLE_NAME` 
 WHERE
  T.`TABLE_TYPE`='BASE TABLE' 
 AND 
  (c.data_type  LIKE '%char%'  OR c.data_type  LIKE '%text%')
 AND 
  (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
    THEN
    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;
END
//
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;
  -- 循环遍历
  loop
    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

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值