循环MySQL动态SQL

循环MySQL动态SQL,mysql,stored-procedures,Mysql,Stored Procedures,我正在尝试创建一个mysql存储过程,它可以在不使用游标的情况下循环和获取动态sql 假设我有 SET @SQLSTATEMENT = CONCAT('SELECT FLD1,FLD2 FROM TABLE1 WHERE FLD1 = \'',PARAM1,'\';'); PREPARE stmt FROM @SQLSTATEMENT; EXECUTE stmt; DEALLOCATE PREPARE stmt; 在不使用游标的情况下,我希望获得该语句的结果,在其中循环并创建另一个select

我正在尝试创建一个mysql存储过程,它可以在不使用游标的情况下循环和获取动态sql

假设我有

SET @SQLSTATEMENT = CONCAT('SELECT FLD1,FLD2 FROM TABLE1 WHERE FLD1 = \'',PARAM1,'\';');
PREPARE stmt FROM @SQLSTATEMENT;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
在不使用游标的情况下,我希望获得该语句的结果,在其中循环并创建另一个select语句

这个想法有点像

Execute SQLStatement
Get Result

Loop
    fetch columns
    execute another sql statement
    get result
    loop
       fetch columns
       fire insert statement
    end loop
End Loop
为此,我需要使用游标创建两个或多个过程。有没有办法只在一个过程中完成

请帮忙。谢谢

我就是这样做的

CREATE DEFINER=`root`@`%` PROCEDURE `ProcSample`(
In Parameter1  VARCHAR(4),
In Parameter2 VARCHAR(2),
In Parameter3 VARCHAR(2),
In Paremeter4 VARCHAR(2)
)
BEGIN

DECLARE i INT(11);
DECLARE j INT(11);
DECLARE SCHEMACOUNT INT(11);
DECLARE TABLENAME VARCHAR(100);
DECLARE RECORDCOUNT INT(11);


Delete from  `sampledb`.`sampletable`;

SET @SCHEMACOUNT = 0;
SET @SQLSTATEMENT = CONCAT('
    SELECT DISTINCT COUNT(TABLE_NAME) INTO @SCHEMACOUNT FROM information_schema.`TABLES`
    WHERE TABLE_SCHEMA LIKE \'%String%\' AND TABLE_SCHEMA NOT LIKE \'%String%\'
    AND TABLE_NAME LIKE \'%String%',Parameter1,Parameter2,'%\';'
);
PREPARE stmt FROM @SQLSTATEMENT;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;


SET @TABLENAME = '';
SET @i = 0;
WHILE @i < @SCHEMACOUNT DO

    SET @SQLSTATEMENT = CONCAT('
        SELECT DISTINCT CONCAT(TABLE_SCHEMA,\'.\',TABLE_NAME) INTO @TABLENAME FROM information_schema.`TABLES`
        WHERE TABLE_SCHEMA LIKE \'%String%\' AND TABLE_SCHEMA NOT LIKE \'%String%\'
        AND TABLE_NAME LIKE \'%String%',Parameter1,Parameter2,'%\'
        ORDER BY TABLE_SCHEMA,TABLE_NAME 
        LIMIT 1 OFFSET ',@i
    );
    PREPARE stmt FROM @SQLSTATEMENT;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    SET @RECORDCOUNT = 0;
    SET @SQLSTATEMENT = CONCAT('
        SELECT  DISTINCT COUNT(`IndexKey`) INTO @RECORDCOUNT FROM ',@TABLENAME,' 
        WHERE `Field1` = \'Value1\' and `Field2` = \'Value2\` '
    );


    PREPARE stmt FROM @SQLSTATEMENT;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    SET @j = 0 ;
    WHILE @j < @RECORDCOUNT DO
        SET @SQLSTATEMENT = CONCAT('
            INSERT INTO `sampledb`.`sampletable` 
            (`Field1`,`Field2`,`Field3`)
            SELECT  `Field1`,`Field2`,`Field3` FROM ',@TABLENAME,' 
            WHERE `Field1` = \'Value1\' and `Field2` = \'Value2\` 
            LIMIT 1 OFFSET ',@j,';'
        );

        PREPARE stmt FROM @SQLSTATEMENT;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;


        SET @j = @j + 1;
    END WHILE;


    SET @i = @i + 1;
END WHILE;



END
CREATE DEFINER=`root`@`%`过程`ProcSample`(
在参数1 VARCHAR(4)中,
在参数2 VARCHAR(2)中,
在参数3 VARCHAR(2)中,
在Paremeter4 VARCHAR(2)中
)
开始
声明i INT(11);
声明j INT(11);
声明schemacountint(11);
声明TABLENAME VARCHAR(100);
声明recordcountint(11);
从“sampledb”中删除。“sampletable”;
设置@SCHEMACOUNT=0;
SET@SQLSTATEMENT=CONCAT('
从信息模式中选择不同的计数(表名称)到@SCHEMACOUNT。`TABLES`
其中,表\u架构类似于\'%String%\,而表\u架构不类似于\'%String%\'
和表名称,如\'%String%',Parameter1,Parameter2,'%\';'
);
从@SQLSTATEMENT准备stmt;
执行stmt;
解除分配准备stmt;
设置@TABLENAME='';
设置@i=0;
而@i<@SCHEMACOUNT DO
SET@SQLSTATEMENT=CONCAT('
选择不同的CONCAT(TABLE_SCHEMA,\'.\',TABLE_NAME)进入@TABLENAME FROM information_SCHEMA.`TABLES`
其中,表\u架构类似于\'%String%\,而表\u架构不类似于\'%String%\'
和表名称,如\'%String%',Parameter1,Parameter2,'%\'
按表\模式、表\名称排序
限制1偏移量',@i
);
从@SQLSTATEMENT准备stmt;
执行stmt;
解除分配准备stmt;
设置@RECORDCOUNT=0;
SET@SQLSTATEMENT=CONCAT('
在@RECORDCOUNT FROM'、@TABLENAME、'中选择不同的计数(`IndexKey`)
其中'Field1`=\'Value1\'和'Field2`=\'Value2\'
);
从@SQLSTATEMENT准备stmt;
执行stmt;
解除分配准备stmt;
设置@j=0;
而@j<@RECORDCOUNT
SET@SQLSTATEMENT=CONCAT('
插入“sampledb”。“sampletable”
(`Field1`、`Field2`、`Field3`)
选择'Field1','Field2','Field3'FROM',@TABLENAME,'
其中'Field1`=\'Value1\'和'Field2`=\'Value2\'
限制1偏移量',@j';'
);
从@SQLSTATEMENT准备stmt;
执行stmt;
解除分配准备stmt;
设置@j=@j+1;
结束时;
设置@i=@i+1;
结束时;
结束

为什么不使用游标?嗨@EdHeal,我只是mysql存储过程的新手,如果我是对的,必须在任何集合或行之前声明游标。在这种情况下,我们需要两个光标,这是关于学习存储过程或完成特定任务的练习吗?这可能看起来有点讨厌,但这正是我想要的。另外,我建议您更改从
information.schema
计算行的语句,以使用
FOUND\u rows()
。它将是:
SET@SCHEMACOUNT=FOUND_ROWS()