【mysql】存储过程,查询指定数据库、具体编码类型含有某字符串的所有表名和列名

1、需求:就是想在一个数据库中查找存在某字符串的表和列;

2、例子,我这里my_test数据库有3张表,test_replace的name、password列有张三字符串,t1表的name、city列也有张三字符串,t_user表就没有张三字符串。

运行结果

t1,name;t1,city;test_replace,name;test_replace,password

符合要求

3、代码

-- 1.将mysql分隔符从;设置为&
DELIMITER &
-- 2.如果存在存储过程getCount则删除
DROP PROCEDURE IF EXISTS `getCount` &
-- 3.定义存储过程,获取特定表列关键词的数量
-- (传入参数table_name字符串类型,为表名;传入参数column_name字符串类型,为列名;传入参数key_name字符串类型,为关键字;传出参数count_date整数类型,为数量)
CREATE DEFINER=`root`@`localhost` PROCEDURE getCount(IN table_name CHAR(200), IN column_name CHAR(200), IN key_name CHAR(20), OUT count_date INT)
    BEGIN
    -- 4.声明变量
    DECLARE $sqltext VARCHAR(1000);
    -- 5.动态sql,把sql返回值放到@count_date中
    SET $sqltext = CONCAT(‘SELECT COUNT(*) into @count_date FROM ‘, table_name, ‘ where ‘, table_name, ‘.‘, column_name, ‘ LIKE \‘%‘, key_name, ‘%\‘;‘);
    SET @sqlcounts := $sqltext;
    -- 6.预编释,stmt预编释变量的名称
    PREPARE stmt FROM @sqlcounts;
    -- 7.执行SQL语句
    EXECUTE stmt;
    -- 8.释放资源
    DEALLOCATE PREPARE stmt;
    -- 9.获取动态SQL语句返回值
    SET count_date = @count_date;
    END
-- 10.定义存储过程结束
&

-- 11.如果存在存储过程getTableColumnNames则删除
DROP PROCEDURE IF EXISTS `getTableColumnNames` &
-- 12.定义存储过程,获取指定数据库关键词的表列名
-- (传入参数database_n字符串类型,数据库名;传入参数collation_n字符串类型,具体编码类型;传入参数key_name字符串类型,为关键字;传出参数tableColumnNames字符串类型,表列名)
CREATE DEFINER=`root`@`localhost` PROCEDURE getTableColumnNames(IN database_n CHAR(20), IN collation_n CHAR(32), IN key_name CHAR(20), OUT tableColumnNames TEXT)
    BEGIN
    -- 13.声明变量。database_name查询出来的数据库,table_name查询出来的表名,column_name查询出来的列名,collation_name查询出来的具体编码类型
    DECLARE database_name, table_name, column_name, collation_name CHAR(200);
    DECLARE tableColumnStr TEXT DEFAULT ‘‘;
    DECLARE resoult_count INT DEFAULT 0;
    -- 14.定义游标结束标识,默认为0
    DECLARE stopflag INT DEFAULT 0;
    -- 15.定义游标,其实就是临时存储sql返回的集合
    DECLARE sql_resoult CURSOR FOR SELECT t.TABLE_SCHEMA, t.TABLE_NAME, t.COLUMN_NAME, t.COLLATION_NAME FROM information_schema.COLUMNS t;
    -- 16.游标结束就设置为1
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET stopflag=1;
    -- 17.打开游标
    OPEN sql_resoult;
        -- 18.读取游标中数据,存储到指定变量
        FETCH sql_resoult INTO database_name, table_name, column_name, collation_name;
        -- 19.没有结束继续往下走
        WHILE (stopflag=0) DO
            BEGIN
            -- 20.判断数据库是否为输入的数据库名称,和,指定具体编码类型,和,不含.
            IF (database_name=database_n AND collation_name=collation_n AND LOCATE(‘.‘, column_name)=0) THEN
                -- 21.调用存储过程,获取特定表列关键词的数量
                CALL getCount(table_name, column_name, key_name, resoult_count);
                -- 22.如果数量不等于0,那么记录表列名
                IF (resoult_count <> 0) THEN
                    -- 23.拼接字符串,不可直接用传出变量设值
            IF (tableColumnStr IS NULL OR tableColumnStr=‘‘) THEN
                SET tableColumnStr=CONCAT(table_name, ‘,‘, column_name);
            ELSE
                SET tableColumnStr=CONCAT(tableColumnStr, ‘;‘, table_name, ‘,‘, column_name);
            END IF;
                END IF;
            END IF;
            -- 24.读取游标中数据,存储到指定变量。(和18一样)
            FETCH sql_resoult INTO database_name, table_name, column_name, collation_name;
            END;
        END WHILE;
    -- 25.关闭游标
    CLOSE sql_resoult;
    -- 26.把数据放到传出参数
    SET tableColumnNames=tableColumnStr;
    END
-- 27.定义存储过程结束
&

-- 28.将mysql分隔符从&设置为;
DELIMITER ;
-- 29.设置变量
SET @tableColumnNames=‘‘;
SET @database=‘my_test‘;
SET @collation_name=‘utf8_general_ci‘;
SET @key=‘张三‘;
-- 30.调用存储过程
CALL getTableColumnNames(@database, @collation_name, @key, @tableColumnNames);
-- 31.打印
SELECT @tableColumnNames;
-- 32.如果存在存储过程则删除
DROP PROCEDURE IF EXISTS `getCount`;
DROP PROCEDURE IF EXISTS `getTableColumnNames`;

注:如果数据库很多,建议在存储过程中指定数据库,这样减少查询的数据量。下面的代码,记得把my_test换成自己要查询的数据库名称。

-- 1.将mysql分隔符从;设置为&
DELIMITER &
-- 2.如果存在存储过程getCount则删除
DROP PROCEDURE IF EXISTS `getCount` &
-- 3.定义存储过程,获取特定表列关键词的数量
-- (传入参数table_name字符串类型,为表名;传入参数column_name字符串类型,为列名;传入参数key_name字符串类型,为关键字;传出参数count_date整数类型,为数量)
CREATE DEFINER=`root`@`localhost` PROCEDURE getCount(IN table_name CHAR(200), IN column_name CHAR(200), IN key_name CHAR(20), OUT count_date INT)
    BEGIN
    -- 4.声明变量
    DECLARE $sqltext VARCHAR(1000);
    -- 5.动态sql,把sql返回值放到@count_date中
    SET $sqltext = CONCAT(‘SELECT COUNT(*) into @count_date FROM ‘, table_name, ‘ where ‘, table_name, ‘.‘, column_name, ‘ LIKE \‘%‘, key_name, ‘%\‘;‘);
    SET @sqlcounts := $sqltext;
    -- 6.预编释,stmt预编释变量的名称
    PREPARE stmt FROM @sqlcounts;
    -- 7.执行SQL语句
    EXECUTE stmt;
    -- 8.释放资源
    DEALLOCATE PREPARE stmt;
    -- 9.获取动态SQL语句返回值
    SET count_date = @count_date;
    END
-- 10.定义存储过程结束
&

-- 11.如果存在存储过程getTableColumnNames则删除
DROP PROCEDURE IF EXISTS `getTableColumnNames` &
-- 12.定义存储过程,获取指定数据库关键词的表列名
-- (传入参数collation_n字符串类型,具体编码类型;传入参数key_name字符串类型,为关键字;传出参数tableColumnNames字符串类型,表列名)
CREATE DEFINER=`root`@`localhost` PROCEDURE getTableColumnNames(IN collation_n CHAR(32), IN key_name CHAR(20), OUT tableColumnNames TEXT)
    BEGIN
    -- 13.声明变量。table_name查询出来的表名,column_name查询出来的列名,collation_name查询出来的具体编码类型
    DECLARE table_name, column_name, collation_name CHAR(200);
    DECLARE tableColumnStr TEXT DEFAULT ‘‘;
    DECLARE resoult_count INT DEFAULT 0;
    -- 14.定义游标结束标识,默认为0
    DECLARE stopflag INT DEFAULT 0;
    -- 15.定义游标,其实就是临时存储sql返回的集合
    DECLARE sql_resoult CURSOR FOR SELECT t.TABLE_NAME, t.COLUMN_NAME, t.COLLATION_NAME FROM information_schema.COLUMNS t WHERE t.TABLE_SCHEMA=‘my_test‘;
    -- 16.游标结束就设置为1
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET stopflag=1;
    -- 17.打开游标
    OPEN sql_resoult;
        -- 18.读取游标中数据,存储到指定变量
        FETCH sql_resoult INTO table_name, column_name, collation_name;
        -- 19.没有结束继续往下走
        WHILE (stopflag=0) DO
            BEGIN
            -- 20.指定具体编码类型,和,不含.
            IF (collation_name=collation_n AND LOCATE(‘.‘, column_name)=0) THEN
                -- 21.调用存储过程,获取特定表列关键词的数量
                CALL getCount(table_name, column_name, key_name, resoult_count);
                -- 22.如果数量不等于0,那么记录表列名
                IF (resoult_count <> 0) THEN
                    -- 23.拼接字符串,不可直接用传出变量设值
                    IF (tableColumnStr IS NULL OR tableColumnStr=‘‘) THEN
                        SET tableColumnStr=CONCAT(table_name, ‘,‘, column_name);
                    ELSE
                        SET tableColumnStr=CONCAT(tableColumnStr, ‘;‘, table_name, ‘,‘, column_name);
                    END IF;
                END IF;
            END IF;
            -- 24.读取游标中数据,存储到指定变量。(和18一样)
            FETCH sql_resoult INTO table_name, column_name, collation_name;
            END;
        END WHILE;
    -- 25.关闭游标
    CLOSE sql_resoult;
    -- 26.把数据放到传出参数
    SET tableColumnNames=tableColumnStr;
    END
-- 27.定义存储过程结束
&

-- 28.将mysql分隔符从&设置为;
DELIMITER ;
-- 29.设置变量
SET @tableColumnNames=‘‘;
SET @collation_name=‘utf8_general_ci‘;
SET @key=‘张三‘;
-- 30.调用存储过程
CALL getTableColumnNames(@collation_name, @key, @tableColumnNames);
-- 31.打印
SELECT @tableColumnNames;
-- 32.如果存在存储过程则删除
DROP PROCEDURE IF EXISTS `getCount`;
DROP PROCEDURE IF EXISTS `getTableColumnNames`;

原文地址:https://www.cnblogs.com/xiaostudy/p/12330644.html

时间: 2024-08-06 06:28:39

【mysql】存储过程,查询指定数据库、具体编码类型含有某字符串的所有表名和列名的相关文章

Linux系统下授权MySQL账户访问指定数据库和数据库操作

Linux系统下授权MySQL账户访问指定数据库 需求: 1.在MySQL中创建数据库mydata 2.新建MySQL账户admin密码123456 3.赋予账户admin对数据库mydata具有完全操作权限 ====================================================================== 操作如下: 1.登录MySQL数据库 mysq  -uroot  -p    #在终端命令行输入 123456         #输入密码 2.sh

数据库常用操作记录:新加列、重命名列、修改列长度和类型、删除列、重命名表名等

1.在数据库已有的表中 增加一个新列 语句:alter table 表名 add 列名 类型 例:ALTER myuser ADD userdesc VARCHAR(50); 2.为数据库中已有的表中的列 重命名 语句:alter table 表名 rename column 原列名 to 新列名; 例:alter table myuser rename column attrname to pk_Group; 3.为数据库中已有的表中的列 修改长度和类型 语句:alter table 表名 m

SQL获取数据库名,表名,列名,说明等信息

由于最近工作涉及SQL语句较多,对一些不常见的SQL函数.及存储过程下面进行整理和描述,供大家分享: /************************************************************************************************************** 1.获取所有用户名: islogin='1' :表示帐户 islogin='0' :表示角色 status='2' :表示用户帐户 status='0' :表示系统帐户 **

MySQL表名、列名区分大小写详解

前言:出现的问题 在本地数据库上执行修改银行卡没有报错 但线上执行报错 发现是表找不到,发现表名不对应该是card_cardinfo,但本地上没有问题,能正常修改,然后在数据库里测试,发现本地库(win)下表名不区分大小写,线上(linux)区分 在刚开始使用mysql的时候,刚开始是想要区分列名大小写的问题,在网上看到很多办法,于是就 1. linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写:   2. 2.用root帐号登录后,在/etc/my.cnf中的[mysql

C#获取Access数据库中的所有表名和列名

//C#获取Access数据库中的所有表名和列名    string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source=E:\report20100819\report20100819.mdb";    OleDbConnection Conn = new OleDbConnection(ConnectionString);    Conn.Open(); DataTable

获得目标服务器中所有数据库名、表名、列名

1 /// <summary> 2 /// 获得目标服务器所有数据库名 3 /// </summary> 4 /// <param name="serverName"></param> 5 /// <param name="userName"></param> 6 /// <param name="password"></param> 7 public

mssqlserver修改表名,列名,添加表列,删除表列,修改表列类型

mssqlserver修改表名,列名,添加表列,删除表列,修改表列类型 ,代码肯定省事的呀 --添加表列 alter table test add address nvarchar(50) null; --删除表列 alter table test drop column address; --修改表列字段类型 alter table test alter column address char(10); --修改表列字段名 exec sp_rename '表名.[列名]', '新的列名', '

从指定的路径中查找含有特殊字符串的文件

import java.io.*;import java.util.*;import java.util.concurrent.*;public class SearchFile{    public static void main(String ... strings)    {        final int FILE_Queue_SIZE = 10;        final int SEARCH_THREADS = 100;        Scanner in = new Scann

从mysql全备 导入指定数据库的数据:三种考虑方法

起因: 公司数据库改造,需要将原有多个数据库恢复到新的服务器上,DBA同事提供给我的其他来源数据库备份均为全备.但是要求并不是全库恢复至新服务器. ---------------- 处理过程: 在这个前提下尝试了三种方法恢复: 注意:在导入前禁用外键,防止导入过程中外键校验导致建表失败,导入完成后开启外键: set foreign_key_checks=0; -- 禁用外键 set foreign_key_checks=1; -- 开启外键 (1)使用--one-database参数导入dysu