存储过程 循环创建多张表 和 多个数据库

本文介绍了一套完整的数据库和表批量操作方案,包括创建和删除多个数据库及其内部表的方法。通过存储过程实现了数据库及表的批量创建与删除,并提供了分表创建与删除的功能。

创建所有数据库 调用:call create_databases('znke_z_log_', 0, 128);
参数说明:
1、要创建的数据库前缀
2、目标数据库后缀最小数 
3、目标数据库后缀最大数(数据库总数量)

CREATE PROCEDURE `create_databases`(IN db_pre VARCHAR(20),IN min_num INT,IN max_num INT)
BEGIN
     DECLARE i INT;
     DECLARE db_name VARCHAR(20);
     DECLARE sql_text VARCHAR(2000);
     SET i=min_num;
     SET db_name='';
     SET sql_text='';
     WHILE i<max_num DO
      SET db_name=CONCAT(db_pre, LPAD(i, LENGTH(max_num), '0'));
    
      SET sql_text=CONCAT('CREATE DATABASE ', db_name, '' );   
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;
END;

删除所有数据库 调用:call delete_databases('znke_z_log_', 0, 60,3);
参数说明:

  1. 要删除的数据库前缀
  2. 目标数据库后缀最小数 
  3. 目标数据库后缀最大数(数据库总数量)
  4. 目标数据库数字的位数
CREATE PROCEDURE `delete_databases`(IN db_pre VARCHAR(20),IN min_num INT,IN max_num INT, IN size INT)
BEGIN
     DECLARE i INT;
     DECLARE db_name VARCHAR(20); 
     DECLARE sql_text VARCHAR(2000);
     SET i=min_num;
     SET db_name='';
     SET sql_text='';
     WHILE i<max_num DO
      SET db_name=CONCAT(db_pre, LPAD(i, size, '0'));
     
      SET sql_text=CONCAT('DROP DATABASE ', db_name, '' );
       
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;
END; 

创建所有数据库中的表.调用:CALL create_tables_of_databases('znke_z_log_', 'log' ,'znke_z_log.log' ,0 , 128);
参数说明:
1、目标数据库的前缀 
2、要创建到目标数据库中的表名称
3、源数据库名称.源表名称(原理从已创建的库中复制,所以先要在源数据库中创建好设计好的表结构) 
4、目标数据库后缀最小数 
5、目标数据库后缀最大数(数据库总数量)

CREATE PROCEDURE `create_tables_of_databases`(IN db_pre VARCHAR(20),IN table_name VARCHAR(20),IN source_db_and_tableName VARCHAR(30),IN min_num INT,IN max_num INT)
BEGIN
     DECLARE i INT;
     DECLARE db_name VARCHAR(20);
    
     DECLARE sql_text VARCHAR(2000);
     SET i=min_num;
     SET db_name='';
    
     SET sql_text='';
     WHILE i<max_num DO
      SET db_name=CONCAT(db_pre, LPAD(i, LENGTH(max_num), '0'));
      
      SET sql_text=CONCAT('CREATE TABLE ', db_name , '.' ,table_name ,' LIKE ' ,source_db_and_tableName); 
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;
   
END;

删除所有数据库中的表调用:CALL delete_tables_of_databases('znke_z_log_', 'log'  ,0 , 128, 3);
参数说明:

  1. 目标数据库的前缀 
  2. 要创建到目标数据库中的表名称 
  3. 目标数据库后缀最小数 
  4. 目标数据库后缀最大数(数据库总数量)
  5. 目标数据库数字的位数
CREATE PROCEDURE `delete_tables_of_databases`(IN db_pre VARCHAR(20),IN table_name VARCHAR(20),IN min_num INT,IN max_num INT, IN size INT)
BEGIN
     DECLARE i INT;
     DECLARE db_name VARCHAR(20);
    
     DECLARE sql_text VARCHAR(2000);
     SET i=min_num;
     SET db_name='';
    
     SET sql_text='';
     WHILE i<max_num DO
      SET db_name=CONCAT(db_pre, LPAD(i, size, '0'));
       
      SET sql_text=CONCAT('DROP TABLE ', db_name , '.' ,table_name); 
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;
   
END;

创建数据库中所有分表(单库多表 分片模式)调用:call create_tables('test', 'user_', 0 ,128);
参数说明:
1、目标数据库(在该数据库中建立很多分表) 
2、要创建到目标数据库中的表前缀 
3、目标数据库后缀最小数 
4、目标数据库后缀最大数(数据库总数量)

CREATE PROCEDURE `create_tables`(IN db_name VARCHAR(20),IN table_pre VARCHAR(20), IN min_num INT,IN max_num INT)
BEGIN
     DECLARE i INT;
     DECLARE table_name VARCHAR(20);
     DECLARE sql_text VARCHAR(2000);
     SET i=min_num;
     SET table_name='';
     SET sql_text='';
     WHILE i<max_num DO
      SET table_name=CONCAT(table_pre, LPAD(i, LENGTH(max_num), '0'));
     
      SET sql_text=CONCAT('CREATE TABLE ',db_name ,'.',table_name, '(
          id VARCHAR(32) NOT NULL,
          user_id VARCHAR(32),
          PRIMARY KEY (id)
        ) ENGINE=INNODB DEFAULT CHARSET=utf8' );
       
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;
END; 

删除数据库中所有分表(单库多表 分片模式)调用:call delete_tables('test', 'user_', 0 ,128, 3);
参数说明:

  1. 目标数据库(在该数据库中建立很多分表) 
  2. 要创建到目标数据库中的表前缀 
  3. 目标数据库后缀最小数 
  4. 目标数据库后缀最大数(数据库总数量)
  5. 目标数据库数字的位数
CREATE PROCEDURE `delete_tables`(IN db_name VARCHAR(20),IN table_pre VARCHAR(20), IN min_num INT,IN max_num INT, IN size INT)
BEGIN
     DECLARE i INT;
     DECLARE table_name VARCHAR(20);
     DECLARE sql_text VARCHAR(2000);
     SET i=min_num;
     SET table_name='';
     SET sql_text='';
     WHILE i<max_num DO
      SET table_name=CONCAT(table_pre, LPAD(i, size, '0'));
     
      SET sql_text=CONCAT('DROP TABLE ', db_name , '.' ,table_name);       
      SELECT sql_text;
      SET @sql_text=sql_text;
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET i=i+1;
    END WHILE;
END; 

删除数据库中指定前缀的表 调用:call Drop_Db_Table('test', 'user_');

参数说明:

1、目标数据库
2、目标数据库中的表前缀  

CREATE PROCEDURE Drop_Db_Table(
  DB_NAME varchar(50),   # 数据库名称
  TB_PREFIX varchar(150) # 表前缀
)
BEGIN
  DECLARE done INT DEFAULT 0; #游标的标志位
  DECLARE a varchar(260);
  DECLARE cur1 CURSOR FOR SELECT table_name FROM information_schema.TABLES WHERE table_schema=DB_NAME AND table_name LIKE CONCAT(TB_PREFIX, '%');
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  
  OPEN cur1;
    REPEAT
    FETCH cur1 INTO a;
      IF NOT done THEN
        SET @E=concat('DROP TABLE ',DB_NAME,'.',a); # 拼删除命令
        PREPARE stmt1 FROM @E;
        EXECUTE stmt1; # 执行命令
        DEALLOCATE PREPARE stmt1; #释放对象
      END IF;
    UNTIL done END REPEAT;
  CLOSE cur1;
END;

调用:call merage_branch_table('user', 100, 3); select @m_merage_sql; 

参数说明:

  1. 目标数据库中的表前缀  
  2. 目标数据库后缀最大数(数据库总数量)
  3. 目标数据库数字的位数
DROP PROCEDURE IF EXISTS `merage_branch_table`;
CREATE PROCEDURE `merage_branch_table`(
    IN     p_table_name   VARCHAR(200),    
    IN     p_branch_size  INT,
    in     p_lpad         INT
)
BEGIN
    DECLARE m_begin_row INT DEFAULT 0;
    SET @m_merage_sql = '';
    WHILE m_begin_row<p_branch_size DO
        IF(m_begin_row=p_branch_size-1)
            THEN SET @m_merage_sql = CONCAT(@m_merage_sql, 'SELECT * FROM ', p_table_name, '_', LPAD(m_begin_row, p_lpad, 0));
            ELSE SET @m_merage_sql = CONCAT(@m_merage_sql, 'SELECT * FROM ', p_table_name, '_', LPAD(m_begin_row, p_lpad, 0),' UNION ALL ');
        END IF;

        SET m_begin_row = m_begin_row+1;
    END WHILE;

    PREPARE main_stmt FROM @m_merage_sql;  
    EXECUTE main_stmt;             
END;

 

### 数据库存储过程的概念 存储过程是一组预编译的SQL语句逻辑控制语句的集合,被存储在数据库中,可以被反复调用[^2]。它允许开发者封装复杂的数据库操作,从而提高代码的重用性执行效率。存储过程的主要特点如下: - **参数支持**:存储过程可以接受输入参数(`IN`),输出参数(`OUT`)或者双向参数(`INOUT`),根据这些参数执行不同的操作。 - **复杂逻辑处理能力**:它可以包含多条SQL语句以及流程控制语句(如 `IF-ELSE` 循环等)[^2]。 - **安全性**:由于其源代码对用户不可见,仅需提供接口供调用,因此具有较高的安全特性。 - **高效性**:存储过程经过编译后以二进制形式保存在数据库中,减少了重复解析的时间开销。 --- ### 存储过程的定义与示例 #### MySQL 中的一个简单存储过程示例 以下是基于MySQL环境下的一个存储过程示例,该存储过程的功能是向员工 (`employees`) 添加一条新记录。 ```sql -- 更改默认分隔符,防止 SQL 解析器提前结束存储过程定义 DELIMITER // -- 创建名为 AddEmployee 的存储过程 CREATE PROCEDURE AddEmployee( IN emp_name VARCHAR(100), IN emp_position VARCHAR(100), IN emp_salary DECIMAL(10, 2) ) BEGIN -- 执行插入操作 INSERT INTO employees (name, position, salary) VALUES (emp_name, emp_position, emp_salary); END // -- 将分隔符恢复为默认值 ; DELIMITER ; -- 调用存储过程 CALL AddEmployee('Alice Johnson', 'Data Analyst', 65000.00); ``` 此示例展示了如何创建一个带有三个输入参数的存储过程,并将其应用于实际场景中[^3]。 --- #### 达梦数据库中的存储过程示例 对于达梦数据库而言,下面是一个查询某张中满足特定条件记录数量的存储过程实例。 ```sql CREATE OR REPLACE PROCEDURE CountRecordsByCondition ( condition_value INT, result_count OUT INT ) AS BEGIN SELECT COUNT(*) INTO result_count FROM sample_table WHERE some_column = condition_value; EXCEPTION WHEN NO_DATA_FOUND THEN result_count := 0; -- 如果无数据,则设置计数值为零 END; -- 假设我们想统计 column_a=5 这种情况的数量 DECLARE total_records INT; BEGIN CountRecordsByCondition(5, total_records); DBMS_OUTPUT.PUT_LINE('Total Records: ' || TO_CHAR(total_records)); END; ``` 在这个例子中,展示了一个带有一个输入参数一个输出参数的存储过程,用于计算符合条件的数据总数[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值