Mysql使用存儲過程生成庫表數據量統計,並放入表中


-- 創建存儲過程之前需判斷該存儲過程是否已存在,若存在則刪除
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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM