如何创建存储过程以通过传递参数将数据从一个表插入到另一表

时间:2019-06-09 08:04:42

标签: mysql stored-procedures

有两个表 1.最终表格(f1,f2,f3,f4) 2.DemoTable_1(d1,d2,d3,d4)

我想使用以下SQL查询将数据从DemoTable_1插入FinalTable:

INSERT INTO `FinalTable`
(`f1`,`f2`,`f3`,`f4`)
 (SELECT `d1`,`d2`,`d3`,`d4`
 FROM DemoTable_1);

所以我想通过传递DemoTable_1作为过程的参数来创建过程。 因此,我可以将源表更改为DemoTable_2,DemoTable_3,DemoTable_4等。

我正在使用SQLyog社区

DELIMITER //
CREATE OR REPLACE PROCEDURE FinalTable_insert(IN source_table VARCHAR(40))
 BEGIN
 INSERT INTO `FinalTable`
(`f1`,`f2`,`f3`,`f4`)
 (SELECT `d1`,`d2`,`d3`,`d4`
 FROM source_table);
 END //
DELIMITER ;

CALL FinalTable_insert('DemoTable_1');
  

错误代码:1146       表'source_table'不存在

1 个答案:

答案 0 :(得分:0)

输入变量的值不等于表名,您必须在字符串中构建查询并使用准备好的语句执行该查询:

DELIMITER //
DROP PROCEDURE IF EXISTS FinalTable_insert //
CREATE PROCEDURE FinalTable_insert(IN source_table VARCHAR(40))
 BEGIN

    SET @sql = CONCAT("INSERT INTO `FinalTable`
            (`f1`,`f2`,`f3`,`f4`)
            SELECT `d1`,`d2`,`d3`,`d4`
            FROM `",source_table,"`");

    PREPARE stmt1 FROM @sql;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1; 

 END //
DELIMITER ;
相关问题