mysql批量操作多数据库存储过程

先从jpa_datasource中读取所有数据库 然后进行遍历执行sql 并记录成功及失败信息日志。

批量增加字段

CREATE DEFINER=`root`@`localhost` PROCEDURE `batchAddField`(IN `tableName` varchar(100),IN `fieldName` varchar(100),IN `fieldType` varchar(100),IN `defaultValue` varchar(100), IN `colComment` varchar(100))
BEGIN

    #数据库名称
    DECLARE schemaName VARCHAR(100); 

    #声明结束标识
    DECLARE end_flag int DEFAULT 0;
		#声明错误代码
    DECLARE code CHAR(5) DEFAULT '00000';
		#声明错误信息
    DECLARE msg TEXT;
		#声明错误结果
		DECLARE result TEXT;
    #声明游标 curosr ,查找所有“MyDB_”开头的数据库
    DECLARE curosr CURSOR FOR SELECT name FROM jpa_datasource;
    #设置终止标志
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET end_flag=1;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
      -- 获取异常code,异常信息
      GET DIAGNOSTICS CONDITION 1
        code = RETURNED_SQLSTATE, msg = MESSAGE_TEXT;
    END;

    #打开游标
    OPEN curosr;
    
    #遍历游标
    loop_label:  LOOP
        
        FETCH curosr INTO schemaName;#获取当前游标指针记录,取出值赋给自定义的变量
        
        IF end_flag > 0 THEN 
            LEAVE  loop_label;
        END IF;
    
				IF defaultValue IS NULL THEN
						SET @sqlStr=CONCAT('alter table ',schemaName,'.',tableName,' add column `',fieldName,'`  ',fieldType,' DEFAULT NULL COMMENT ''', colComment, '''');
				ELSE
						SET @sqlStr=CONCAT('alter table ',schemaName,'.',tableName,' add column `',fieldName,'`  ',fieldType,' DEFAULT ''',defaultValue,''' COMMENT ''', colComment, '''');
				END IF;
    PREPARE stmt from @sqlStr;
    EXECUTE stmt;
		
				-- 检查code是否改变,如果改变表示插入异常了
				IF code = '00000' THEN
					SET result = CONCAT('succeeded');
				ELSE
					-- 复制异常code,异常信息
					SET result = CONCAT('failed, error = ',code,', message = ',msg);
					-- 重新置为初始值
					SET code = '00000';
				END IF;
				-- 记录日志
				INSERT INTO procedure_process_log(schemaName, type, result, tableName, fieldName, fieldType, defaultValue, 	 colComment, createdAt) VALUES(schemaName, 'add', result, tableName, fieldName, fieldType, defaultValue, colComment, now());
    END LOOP;
    
  #关闭游标
    close curosr;
END

批量修改字段

CREATE DEFINER=`root`@`localhost` PROCEDURE `batchModifyField`(IN `tableName` varchar(100),IN `fieldName` varchar(100),IN `fieldType` varchar(100),IN `defaultValue` varchar(100), IN `colComment` varchar(100))
BEGIN

    #数据库名称
    DECLARE schemaName VARCHAR(100); 

    #声明结束标识
    DECLARE end_flag int DEFAULT 0;
		#声明错误代码
    DECLARE code CHAR(5) DEFAULT '00000';
		#声明错误信息
    DECLARE msg TEXT;
		#声明错误结果
		DECLARE result TEXT;
    #声明游标 curosr ,查找所有“MyDB_”开头的数据库
    DECLARE curosr CURSOR FOR SELECT name FROM jpa_datasource;
    #设置终止标志
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET end_flag=1;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
      -- 获取异常code,异常信息
      GET DIAGNOSTICS CONDITION 1
        code = RETURNED_SQLSTATE, msg = MESSAGE_TEXT;
    END;

    #打开游标
    OPEN curosr;
    
    #遍历游标
    loop_label:  LOOP
        
        FETCH curosr INTO schemaName;#获取当前游标指针记录,取出值赋给自定义的变量
        
        IF end_flag > 0 THEN 
            LEAVE  loop_label;
        END IF;
    
				IF defaultValue IS NULL THEN
						SET @sqlStr=CONCAT('alter table ',schemaName,'.',tableName,' modify column `',fieldName,'`  ',fieldType,' DEFAULT NULL COMMENT ''', colComment, '''');
				ELSE
						SET @sqlStr=CONCAT('alter table ',schemaName,'.',tableName,' modify column `',fieldName,'`  ',fieldType,' DEFAULT ''',defaultValue,''' COMMENT ''', colComment, '''');
				END IF;
    PREPARE stmt from @sqlStr;
    EXECUTE stmt;
		
				-- 检查code是否改变,如果改变表示插入异常了
				IF code = '00000' THEN
					SET result = CONCAT('succeeded');
				ELSE
					-- 复制异常code,异常信息
					SET result = CONCAT('failed, error = ',code,', message = ',msg);
					-- 重新置为初始值
					SET code = '00000';
				END IF;
				-- 记录日志
				INSERT INTO procedure_process_log(schemaName, type, result, tableName, fieldName, fieldType, defaultValue, 	 colComment, createdAt) VALUES(schemaName, 'modify', result, tableName, fieldName, fieldType, defaultValue, colComment, now());
    END LOOP;
    
  #关闭游标
    close curosr;
END

实际大体逻辑相同 只是改了执行的sql而已

数据库存储表

CREATE TABLE `jpa_datasource` (
  `name` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

执行日志表

CREATE TABLE `procedure_process_log` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `schemaName` varchar(100) DEFAULT NULL,
  `type` varchar(20) DEFAULT NULL,
  `result` text,
  `tableName` varchar(100) DEFAULT NULL,
  `fieldName` varchar(100) DEFAULT NULL,
  `fieldType` varchar(100) DEFAULT NULL,
  `defaultValue` varchar(100) DEFAULT NULL,
  `colComment` varchar(100) DEFAULT NULL,
  `createdAt` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4;

效果演示:

添加字段

call batchAddField('jpa_items', 'sort', 'int(11)', 0, '排序值')

在这里插入图片描述
再次执行
在这里插入图片描述
执行修改

call batchModifyField('jpa_items', 'sort', 'int(12)', 0, '排序值')

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值