Primeiro, como mencionado por @eggyal, esta não é a melhor maneira de fazer as coisas. Mas isso pode ser feito usando declarações preparadas. Ou seja
DROP PROCEDURE IF EXISTS `exampleOfPrepareStatement`;
CREATE DEFINER = `user`@`%` PROCEDURE `exampleOfPrepareStatement`(inTableName VARCHAR(100))
MODIFIES SQL DATA
SQL SECURITY INVOKER
BEGIN
SET @hr1 = CONCAT('
INSERT INTO `',inTableName,'` (
-- fields (can use parameters same as table name if needed)
)
-- either VALUES () or SELECT here
');
-- Prepare, execute, deallocate
PREPARE hrStmt1 FROM @hr1;
EXECUTE hrStmt1;
DEALLOCATE PREPARE hrStmt1;
END;
É claro que você pode adicionar nomes de campo etc. conforme necessário, ou usar um SELECT ou UPDATE etc. Isso não é o ideal, mas fará o que você está procurando.
Eu tive que usar isso em alguns lugares antes onde a mesma manutenção está sendo executada em várias tabelas que têm nomes de campo diferentes ( / nomes de tabela ) e, portanto, em vez de escrever a mesma função 20 vezes, uso esse tipo de procedimento armazenado que pode então ser chamado para fazer a indexação etc.
Como também mencionado por @eggyal , embora isso possa fazer o que você pede, pode não fazer o que você precisa. Se você puder fornecer mais informações, poderá obter uma solução melhor.