Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment écrire une fonction mysql avec un nom de table dynamique ?

Tout d'abord, comme mentionné par @eggyal, ce n'est pas la meilleure façon de procéder. Mais cela peut être fait en utilisant des instructions préparées. C'est-à-dire

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;

Vous pouvez bien sûr ajouter des noms de champs, etc. selon vos besoins, ou utiliser un SELECT ou UPDATE, etc. Ce n'est pas idéal, mais fera ce que vous recherchez.

J'ai dû l'utiliser à certains endroits auparavant où la même maintenance est effectuée sur plusieurs tables qui ont des noms de champs différents ( / noms de table ) et donc au lieu d'écrire la même fonction 20 fois, j'utilise plutôt ce type de procédure stockée qui peut alors être appelé pour faire l'indexation etc.

Comme également mentionné par @eggyal, même si cela peut faire ce que vous demandez, cela peut ne pas faire ce dont vous avez besoin. Si vous pouvez fournir plus d'informations, vous obtiendrez peut-être une meilleure solution.