-- 創建存儲過程之前需判斷該存儲過程是否已存在,若存在則刪除 DROP PROCEDURE IF EXISTS getTableInfo; -- 創建存儲過程 CREATE PROCEDURE getTableInfo() BEGIN -- 定義變量 DECLARE s int DEFAULT 0; DECLARE dbname varchar(255); DECLARE tabname varchar(256); -- 定義游標,並將sql結果集賦值到游標中 DECLARE tabs CURSOR FOR select table_schema,table_name from dq_tables; -- 聲明當游標遍歷完后將標志變量置成某個值 DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1; -- 創建結果存放表 create table if not exists `dq_tables` ( `table_schema` VARCHAR ( 255 ) DEFAULT NULL COMMENT '數據庫名稱', `dept_name` VARCHAR ( 256 ) DEFAULT NULL COMMENT '委辦局名稱', `table_name` VARCHAR ( 257 ) DEFAULT NULL COMMENT '表英文名稱', `table_comment` VARCHAR ( 258 ) DEFAULT NULL COMMENT '表中文名稱', `table_rows` VARCHAR ( 259 ) DEFAULT NULL COMMENT '數據行數', `data_size` VARCHAR ( 260 ) DEFAULT NULL COMMENT '表大小', `create_time` VARCHAR ( 261 ) DEFAULT NULL COMMENT '創建時間', `update_time` VARCHAR ( 262 ) DEFAULT NULL COMMENT '更新時間', `is_cp` VARCHAR ( 262 ) DEFAULT NULL COMMENT '是否統計列完整性', `update_type` VARCHAR ( 255 ) DEFAULT NULL COMMENT '更新類型', `update_freq` VARCHAR ( 255 ) DEFAULT NULL COMMENT '更新頻率', `db_type` VARCHAR ( 255 ) DEFAULT NULL COMMENT '入庫方式' ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '數據質量-數據表相關信息'; -- 插入庫表原始數據 insert into dq_tables select t.table_schema as 數據庫名稱, null , t.table_name as 表英文名稱, t.table_comment as 表中文名稱, null as 數據行數, ( t.data_length / 1024 ) as 表大小, t.create_time as 創建時間, t.update_time as 更新時間 , 1, null, null, null from information_schema.`tables` t left join dq_tables d on t.table_name = d.table_name and t.table_schema = d.table_schema where d.table_name is null and t.table_schema not in ('information_schema','mysql','performance_schema','test','sakila','sys') and t.table_name <> 'dq_tables'; -- 打開游標 open tabs; -- 當s不等於1,也就是未遍歷完時,會一直循環 while s<>1 do -- 執行業務邏輯 fetch tabs into dbname,tabname; -- 更新數據行數 set @esql =CONCAT("update dq_tables set table_rows = (select count(1) from ",dbname,'.',tabname,") where table_schema='",dbname,"' and table_name='",tabname,"' "); PREPARE stmt FROM @esql; EXECUTE stmt ; end while; -- 當s等於1時表明遍歷以完成,退出循環 -- 關閉游標 close tabs; DEALLOCATE PREPARE stmt; -- 釋放連接 END;