存储过程以读取文本文件并循环遍历它

时间:2018-02-08 04:38:41

标签: mysql stored-procedures

我尝试了很多线索,但无法找到对我有用的东西。

我有一个包含表名列表的文本文件(架构中300个表中约有100个)。

tables.txt

table1
table2
table3

我正在编写一个存储过程,想要遍历该文本文件中的表名,并在查询中注入表名。

像这样的东西

While (line = readline) != null do
 update line set col1='foo' where id=x;
End while;

在存储过程中甚至可以实现这样的功能吗?使用(mysql 5.6)。我正在使用Workbench 6.3 CE

2 个答案:

答案 0 :(得分:1)

由于您希望为数据库中的每个表运行相同的代码。您可以使用信息架构创建命令

USE INFORMATION_SCHEMA;
SELECT 
CONCAT("ALTER TABLE `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` ALTERING CODE HERE;") 
AS MySQLCMD FROM TABLES 
WHERE TABLE_SCHEMA = "your_schema_goes_here";

创建命令后,您可以复制并运行所有命令。

更新如果您想更新所有这些表之间的公共列,可以按照以下方式编写

SELECT CONCAT("UPDATE `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` SET COLUMN_NAME = VALUE [ANY WHERE CLAUSE]") as MySQLCMD from TABLES where TABLE_SCHEMA = "YourSchemaName";

UPDATE2 为特定表生成命令。

   SELECT 
    CONCAT("ALTER TABLE `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` ALTERING CODE HERE;") 
    AS MySQLCMD FROM TABLES 
    WHERE TABLE_SCHEMA = "your_schema_goes_here" AND TABLE_NAME IN ('Table1', 'TAble2');

答案 1 :(得分:0)

总的来说,我会采用这种方法。没有足够的细节更具体。注意,这使用动态SQL而不是存储过程。

  1. 备份您的数据库!!

  2. 创建临时表。 (无论是真实的还是在记忆中,取决于您需要保留此数据的时间长度)

  3. 使用以下内容将文本文件解析为临时表:

    LOAD DATA INFILE'/tmp/mylist.txt'INTO TABLE MyTempList;

  4. 创建一个ALTER表语句的测试。一旦你知道它完全符合预期......

  5. 将工作的ALTER语句转换为动态SQL,从临时表中选择表名。这样的事情:Alter table using sub select

  6. 完成后,您可以删除临时表。

  7. 或者,您可以将单个ALTER语句放入存储过程,并将表名称作为参数。但是,您仍然需要使用类似步骤1-3的内容来解析文本文件。然后使用游标循环遍历表名并调用存储过程。