遍历逗号分隔值

Abd*_*man 6 mysql stored-procedures

我有一个主数据库。我想制作主数据库的重复数据库,但不是刚刚指定的所有表。

我在逗号分隔的字符串中有这些表名。 tbl1, tbl2, tbl7, tbl10等等。

我正在尝试创建一个传递它的存储过程,它new DB name创建数据库并将给定的表复制到它。到目前为止,我有两件事,但我不知道如何遍历它。我是 DB 新手,所以请指导如何实现这一点。

我还没有发现是否可以使用数组来循环,表名也可以存储在数组变量中,因为表名是硬编码的。

以下是我想要的 sudo 代码。

CREATE DATABASE %param_db%;

@tables = 'tbl1, tbl2, tbl7, tbl10';
loop through @tables as table_name
    CREATE TABLE %param_db.table_name% LIKE Master.%table_name%;
End loop
Run Code Online (Sandbox Code Playgroud)

Rol*_*DBA 8

以下是在存储过程中进行布局的步骤

  • 创建目标数据库
  • 确定表格列表中有多少个元素
  • 使用ELT() 函数遍历表列表的每个元素
  • 取每个元素并形成SQL语句在目标数据库中创建新表

这是存储过程

DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`TableCookieCutter` $$
CREATE PROCEDURE `test`.`TableCookieCutter`
(
    SourceDB VARCHAR(64),
    TargetDB VARCHAR(64),
    TableList VARCHAR(1024)
)
BEGIN

    # Create the Target DB
    SET @sql = CONCAT('CREATE DATABASE IF NOT EXISTS ',TargetDB);
    PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;

    # Strip Table List of Blanks
    # Enclose each table in quotes
    SET @table_list = CONCAT('''',REPLACE(REPLACE(TableList ,' ',''),',',QUOTE(',')),'''');

    # Count the number of tables in the list
    SET @table_stub = REPLACE(@table_list,',','');
    SET @array_count = LENGTH(@table_list) - LENGTH(@table_stub) + 1;

    # Loop through list of tables, creating each table
    SET @x = 0;
    WHILE @x < @array_count DO
        SET @x = @x + 1;
        SET @sql = CONCAT('SELECT ELT(',@x,',',@table_list,') INTO @tb');
        PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
        SET @sql = CONCAT('CREATE TABLE ',TargetDB,'.',@tb,' LIKE ',SourceDB,'.',@tb);
        PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
    END WHILE;

END $$

DELIMITER ;
Run Code Online (Sandbox Code Playgroud)