2017-02-02 2 views
0

Est-il possible de créer une procédure stockée à partir d'une autre procédure stockée dans MySQL?MySQL Créer une procédure stockée dans une autre procédure stockée

Nous gérons des mises à jour de base de données en utilisant une procédure stockée temporaire qui vérifie la version de base de données dans une table:

DELIMITER # 
DROP PROCEDURE IF EXISTS sp_temp_update_table# 
CREATE PROCEDURE sp_temp_update_table() 
BEGIN 
    DECLARE v_db_version DECIMAL(10,6); 

    SELECT CAST(`value` AS DECIMAL(10,6)) INTO v_db_version 
    FROM `db_metadata` meta 
    WHERE meta.`key` = 'db_version'; 

    IF(v_db_version < CAST('13.30' AS DECIMAL(10,6))) THEN 
     -- UPDATE STATEMENTS HERE 
     ALTER TABLE `foo` ADD COLUMN `bar` INT(10); 

     UPDATE `etl_metadata` SET `value` = '13.30' WHERE `key` = 'db_version'; 
     SELECT CONCAT('13.30 Update Applied - Original db_version=', v_db_version); 
    ELSE 
     SELECT '13.30 Update Not Needed'; 
    END IF; 
END# 
CALL sp_temp_update_table()# 
DROP PROCEDURE IF EXISTS sp_temp_update_table# 
DELIMITER ; 

Maintenant, nous avons besoin de mettre à jour une procédure stockée à l'intérieur de cette procédure.

Existe-t-il un moyen d'accomplir cela dans MySQL?

Répondre

1

Vous ne pouvez pas create a stored procedure in a prepared statement dans MySQL, et vous généralement can't do anything in a stored procedure that you can't do in a prepared statement.

Vous peutlire create dans une chaîne (select routine_definition into myVar from information_schema.routines where routine_name='myRoutine') qui peut être utilisé, par exemple, d'avoir votre procédure stockée créer un script SQL qui contient les commandes pour mettre à jour les procédures stockées de la procédure. Vous devrez ensuite exécuter ce sql manuellement (ou à partir d'un script shell, cron-job, peu importe) après avoir exécuté le SP ci-dessus, et il fera alors les changements requis.

EDIT: Tout cela suppose que la mise à jour dynamique des SP est vraiment ce que vous voulez faire. Il peut y avoir des solutions beaucoup plus propres, par exemple faire en sorte que les parties codées en dur que vous voulez modifier prennent un paramètre d'entrée ou soient lues à partir d'une table ...