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

Mysql crée une procédure stockée à partir de plusieurs procédures stockées

Comme je pense que la fonctionnalité ci-dessus n'est pas implémentée dans MySQL. Voir ici pour plus d'informations.

Je suis venu avec la solution suivante. Mais pas sûr que ce soit la meilleure approche pour ce problème.

DELIMITER //
CREATE PROCEDURE pro_1(IN param1 data_type,IN param2 data_type);
BEGIN
   CREATE TEMPORARY TABLE temp1 AS SELECT * FROM table_name WHERE $where1;
COMMIT;
END //
DELIMITER ;

comme ci-dessus, vous pouvez créer les deux procédures suivantes comme suit.

DELIMITER //
CREATE PROCEDURE pro_2(IN param1 data_type,IN param2 data_type);
BEGIN
   CREATE TEMPORARY TABLE temp2 AS SELECT * FROM table_name WHERE $where2;
COMMIT;
END //
DELIMITER ;

DELIMITER //
CREATE PROCEDURE pro_3(IN param1 data_type,IN param2 data_type);
BEGIN
   CREATE TEMPORARY TABLE temp3 AS SELECT * FROM table_name WHERE $where3;
COMMIT;
END //
DELIMITER ;

Voici donc la procédure principale qui est l'union des 3 procédures ci-dessus.

DELIMITER //
CREATE PROCEDURE master_pro(IN param1 data_type,IN param2 data_type);
BEGIN
   CALL pro_1(param1,param2);
   CALL pro_2(param1,param2);
   CALL pro_3(param1,param2);
   CREATE TEMPORARY TABLE master_temp AS (SELECT * FROM temp1) UNION ALL (SELECT *  FROM temp2) UNION ALL (SELECT * FROM temp3);
COMMIT;
END //
DELIMITER ;

Donc, enfin, si vous souhaitez obtenir d'autres résultats de la procédure principale, vous pouvez procéder comme suit.

DELIMITER //
CREATE PROCEDURE another_pro(IN param1 data_type,IN param2 data_type);
BEGIN
   CALL master_pro(param1,param2);
   SELECT columns_from_master_temp FROM master_temp WHERE where_clause;
COMMIT;
END //
DELIMITER ;