添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

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 
 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