代码知识点:
1、字符串截取
2、sql语句拼接
3、动态sql语句
直接上代码
第一种方法:(information_schema方法)
BEGIN
declare AllTableName VARCHAR(4000); /*存储数据库名和表名的总文本信息*/
declare tablename varchar(40); /*存储解析出来的表名称*/
declare databasename varchar(30); /*存储解析出来的数据库名称*/
declare v_sql varchar(200); /*存储预编译sql语句*/
drop table if exists Mark_tabletotal;
create temporary table Mark_tabletotal( /*创建数据库的临时表,用于临时存储查询出的信息*/
table_name varchar(40),
table_count int
);
set AllTableName ='spprogram.animal,spprogram.books,gmp2.adminuser,'; /*数据库和数据库表名的文本,数据库和表之间用.隔开,两个字段之间用,隔开*/
while LOCATE(',',AllTableName)>0 do
set databasename = substring(AllTableName,1,LOCATE('.',AllTableName)-1); /*截取数据库名称*/
set AllTableName = SUBSTRING(AllTableName, LOCATE('.',AllTableName) + 1); /*截取完数据库名称,将截取出的数据库名称从总字段中删除包括用于和表分隔得.也同时删除*/
set tablename = substring(AllTableName,1, LOCATE(',',AllTableName)-1); /*截取表名称*/
set AllTableName = SUBSTRING(AllTableName, LOCATE(',',AllTableName) + 1); /*截取表名称,将截取出的数据库名称从总字段中删除包括用于字段分隔的,也同时删除*/
/*select * from information_schema.tables where table_schema= '数据库名' and table_name = '名';*/
/*上面的语句用于查询指定数据库下指定表的信息*/
/*动态sql拼接*/
set v_sql = concat('select table_rows into @table_count from information_schema.tables where table_schema= ''',databasename,''' and table_name = ''',tablename,''';');
set @sql =v_sql;
/*将拼接好的sql语句赋值给一个变量,******很重要很重要,不可没有*/
prepare stmt from @sql; /* 预处理需要执行的sql,其中stmt是赋予的名称*/
execute stmt; /*执行stmt预处理的语句*/
set tablename = concat(databasename,'.',tablename);
insert into Mark_tabletotal values(tablename,@table_count); /*将查询出来的表信息和表名称,插入到临时表中*/
end while;
deallocate prepare stmt; /*释放掉预处理*/
select * from Mark_tabletotal; /*查询出临时表中的信息*/
drop table Mark_tabletotal; /*删除掉临时表*/
END
第二种方法:(数据库名称.表名,直接锁定要查询的表)
BEGIN
declare AllTableName VARCHAR(4000); /*存储数据库名和表名的总文本信息*/
declare tablename varchar(40); /*存储解析出来的表名称*//*存储解析出来的数据库名称*/
declare v_sql varchar(200); /*存储预编译sql语句*/
drop table if exists Mark_tabletotal;
create temporary table Mark_tabletotal( /*创建数据库的临时表,用于临时存储查询出的信息*/
table_name varchar(40),
table_count int
);
set AllTableName ='spprogram.animal,spprogram.books,gmp2.adminuser,'; /*数据库和数据库表名的文本,数据库和表之间用.隔开,两个字段之间用,隔开*/
while LOCATE(',',AllTableName)>0 do
/*substring(str,pos,length) str代表字符串,pos代表从什么地方开始截取,length代表截取长度
locate(substr,str) 返回substr在字符串str中第一次出现的点
*/
set tablename = substring(AllTableName,1, LOCATE(',',AllTableName)-1);/*截取要查询的书库局名称和表名称*/
set AllTableName = SUBSTRING(AllTableName, LOCATE(',',AllTableName) + 1);/*将截取出的数据库名称和表名称从总字段中删除包括用于字段分隔的,也同时删除*/
/*要理解字符串截取的规则
第一次截取出来的tablename是'spprogram.animal' 第一次经过截取的总字符串是'spprogram.books,gmp2.adminuser,'
第二次截取出来的tablename是'spprogram.books' 第二次经过截取的总字符串
是'gmp2.adminuser,'
*/
/*动态sql拼接*/
set v_sql = concat('select count(*) into @table_count from ',tablename,';');
set @sql =v_sql;
/*将拼接好的sql语句赋值给一个变量,******很重要很重要,不可没有*/
prepare stmt from @sql; /*预处理需要执行的sql,其中stmt是赋予的名称*/
execute stmt; /*执行stmt预处理的语句*/
insert into Mark_tabletotal values(tablename,@table_count); /*将查询出来的表信息和表名称,插入到临时表中*/
end while;
deallocate prepare stmt; /*释放掉预处理*/
select * from Mark_tabletotal; /*查询出临时表中的信息*/
drop table Mark_tabletotal; /*删除掉临时表*/
END