Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie schreibe ich eine MySQL-Funktion mit dynamischem Tabellennamen?

Zunächst einmal, wie von @eggyal erwähnt, ist dies nicht der beste Weg, um Dinge anzugehen. Dies kann jedoch durch die Verwendung vorbereiteter Anweisungen erfolgen. D.h.

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;

Sie können natürlich Feldnamen usw. nach Bedarf hinzufügen oder ein SELECT oder UPDATE usw. verwenden. Dies ist nicht ideal, wird aber das tun, wonach Sie suchen.

Ich musste dies schon früher an einigen Stellen verwenden, an denen dieselbe Wartung für mehrere Tabellen mit unterschiedlichen Feldnamen ( / table names ) durchgeführt wird, und anstatt dieselbe Funktion 20 Mal zu schreiben, verwende ich stattdessen diese Art von gespeicherter Prozedur which kann dann aufgerufen werden, um die Indizierung usw. durchzuführen.

Wie auch von @eggyal erwähnt, kann dies zwar das tun, was Sie verlangen, aber möglicherweise nicht das, was Sie brauchen. Wenn Sie weitere Informationen bereitstellen können, erhalten Sie möglicherweise eine bessere Lösung.