mysql5.7 虚拟列存储过程

BEGIN
DECLARE Done INT DEFAULT 0;
DECLARE v_tablename VARCHAR(50);

DECLARE rs CURSOR FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'wd' AND TABLE_NAME REGEXP '^(page_).*_.*';
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done=1;
OPEN rs;
FETCH NEXT FROM rs INTO v_tablename;
REPEAT
IF NOT Done THEN

set @sqllang = CONCAT("ALTER TABLE " , v_tablename ,  " ADD `creatTime`  varchar (30) GENERATED ALWAYS  AS (replace(json_extract(info,  '$.creatTime' ),'\"','' ) ) VIRTUAL");
PREPARE stmt FROM @sqllang;  
EXECUTE stmt;

set @sqllang = CONCAT("ALTER TABLE " , v_tablename ,  " ADD `lastScanTime`  varchar (30) GENERATED ALWAYS  AS (replace(json_extract(info,  '$.lastScanTime' ),'\"','') ) VIRTUAL");
PREPARE stmt FROM @sqllang;  
EXECUTE stmt;

set @sqllang = CONCAT("ALTER TABLE " , v_tablename ,  " ADD `statusCode`     INT(6)  GENERATED ALWAYS  AS (json_extract(info,  '$.statusCode' ))   VIRTUAL");
PREPARE stmt FROM @sqllang;  
EXECUTE stmt;

set @sqllang = CONCAT("ALTER TABLE " , v_tablename ,  " ADD `pageType`     varchar(15)  GENERATED ALWAYS  AS (replace(json_extract(info,  '$.pageType' ),'\"','') )   VIRTUAL");
PREPARE stmt FROM @sqllang;  
EXECUTE stmt;

set @sqllang = CONCAT("CREATE INDEX idx_createTime  ON " , v_tablename , "(creatTime)");
PREPARE stmt FROM @sqllang;  
EXECUTE stmt;

set @sqllang = CONCAT("CREATE INDEX idx_lastScanTime ON ",v_tablename,"(lastScanTime)");
PREPARE stmt FROM @sqllang;  
EXECUTE stmt;

set @sqllang = CONCAT("CREATE INDEX idx_statusCode  ON " , v_tablename , "(statusCode)");
PREPARE stmt FROM @sqllang;  
EXECUTE stmt;

set @sqllang = CONCAT("CREATE INDEX idx_pageType  ON " , v_tablename , "(pageType)");
PREPARE stmt FROM @sqllang;  
EXECUTE stmt;
 
END IF;
FETCH NEXT FROM rs INTO v_tablename;

UNTIL Done END REPEAT;
CLOSE rs;
end

 

 

CREATE DEFINER = 'root'@'%'
PROCEDURE wd.dropColumnAndIndex()
BEGIN
DECLARE Done INT DEFAULT 0;
DECLARE v_tablename VARCHAR(50);
DECLARE v_row int DEFAULT 0; 

DECLARE rs CURSOR FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'wd' AND TABLE_NAME REGEXP '^(page_).*_.*';
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done=1;
OPEN rs;
FETCH NEXT FROM rs INTO v_tablename;
REPEAT
IF NOT Done THEN

set @sqllang = CONCAT("SELECT count(1) into @row FROM INFORMATION_SCHEMA.statistics  WHERE table_schema= 'wd' AND table_name= '" ,v_tablename,"' AND INDEX_NAME= 'idx_createTime'");  
PREPARE stmt FROM @sqllang;  
EXECUTE stmt;
if (@row > 0) then
    set @sqllang = CONCAT("ALTER TABLE " , v_tablename ,  " DROP INDEX `idx_createTime` ");
    PREPARE stmt FROM @sqllang;  
    EXECUTE stmt;
end if;

set @sqlexist = CONCAT("SELECT count(1) into @row FROM INFORMATION_SCHEMA.statistics  WHERE table_schema= 'wd' AND table_name= '" ,v_tablename,"' AND INDEX_NAME= 'idx_lastScanTime'");  
PREPARE stmt FROM @sqlexist;  
EXECUTE stmt;
if (@row > 0) then
    set @sqllang = CONCAT("ALTER TABLE " , v_tablename ,  " DROP INDEX `idx_lastScanTime` ");
    PREPARE stmt FROM @sqllang;  
    EXECUTE stmt;
end if;

set @sqlexist = CONCAT("SELECT count(1) into @row FROM INFORMATION_SCHEMA.statistics  WHERE table_schema= 'wd' AND table_name= '" ,v_tablename,"' AND INDEX_NAME= 'idx_statusCode'");  
PREPARE stmt FROM @sqlexist;  
EXECUTE stmt;
if (@row > 0) then
    set @sqllang = CONCAT("ALTER TABLE " , v_tablename ,  " DROP INDEX `idx_statusCode` "); 
    PREPARE stmt FROM @sqllang;  
    EXECUTE stmt;
end if;

set @sqlexist = CONCAT("SELECT count(1) into @row FROM INFORMATION_SCHEMA.Columns  WHERE table_schema= 'wd' AND table_name= '" ,v_tablename,"' AND column_name= 'creatTime'");  
PREPARE stmt FROM @sqlexist;  
EXECUTE stmt;
if (@row > 0) then
    set @sqllang = CONCAT("ALTER TABLE " , v_tablename ,  " drop column creatTime ");
    PREPARE stmt FROM @sqllang;  
    EXECUTE stmt;
end if;

set @sqlexist = CONCAT("SELECT count(1) into @row FROM INFORMATION_SCHEMA.Columns  WHERE table_schema= 'wd' AND table_name= '" ,v_tablename,"' AND column_name= 'lastScanTime'");  
PREPARE stmt FROM @sqlexist;  
EXECUTE stmt;
if (@row > 0) then
    set @sqllang = CONCAT("ALTER TABLE " , v_tablename ,  " DROP COLUMN  lastScanTime ");
    PREPARE stmt FROM @sqllang;  
    EXECUTE stmt;
end if;

set @sqlexist = CONCAT("SELECT count(1) into @row FROM INFORMATION_SCHEMA.Columns  WHERE table_schema= 'wd' AND table_name= '" ,v_tablename,"' AND column_name= 'statusCode'");  
PREPARE stmt FROM @sqlexist;  
EXECUTE stmt;
if (@row > 0) then
    set @sqllang = CONCAT("ALTER TABLE " , v_tablename ,  " DROP COLUMN statusCode ");
    PREPARE stmt FROM @sqllang;  
    EXECUTE stmt;
end if;
 
END IF;
FETCH NEXT FROM rs INTO v_tablename;

UNTIL Done END REPEAT;
CLOSE rs;
end

 

posted @ 2017-08-04 17:14  roscee  阅读(488)  评论(0编辑  收藏  举报