sql >> Databasteknik >  >> RDS >> Mysql

Hur skriver man en mysql-funktion med dynamiskt tabellnamn?

Först ut, som nämnts av @eggyal, är detta inte det bästa sättet att gå till väga. Men det kan göras genom att använda förberedda uttalanden. Dvs

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;

Du kan naturligtvis lägga till fältnamn etc. efter behov, eller använda en SELECT eller UPDATE etc. Detta är inte idealiskt, men kommer att göra det du letar efter.

Jag har varit tvungen att använda detta på vissa ställen tidigare där samma underhåll utförs på flera tabeller som har olika fältnamn (/tabellnamn) och så istället för att skriva samma funktion 20 gånger använder jag istället den här typen av lagrad procedur som kan sedan anropas för att göra indexeringen etc.

Som också nämnts av @eggyal, även om det här kan göra som du ber om, kanske det inte gör som du behöver. Om du kan ge mer information kan du få en bättre lösning.



  1. MySQL NOW() funktion med hög precision

  2. Hämtar SQLEXCEPTION-meddelande i procedurer MySQL 5.5.x

  3. använd kommandot database_name i PostgreSQL

  4. Varför infoga TSQL-satsblock när transaktionsisoleringsnivån för en annan transaktion kan serialiseras med ett icke-konfliktande filter?