sql >> Database >  >> RDS >> Mysql

Mysql maakt een opgeslagen procedure van meerdere opgeslagen procedures

Zoals ik denk dat bovenstaande functie niet is geïmplementeerd in MySQL. Zie hier voor meer informatie.

Ik kwam tot de volgende oplossing. Maar ik weet niet zeker of dit de beste aanpak voor dit probleem is.

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 ;

zoals hierboven kunt u de volgende twee procedures als volgt maken.

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 ;

Dus het volgende is de hoofdprocedure die een unie is van de bovenstaande 3 procedures.

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 ;

Dus als je eindelijk andere resultaten van de masterprocedure wilt krijgen, kun je als volgt doen.

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 ;



  1. Database-sharding versus partitionering

  2. MariaDB BENCHMARK() uitgelegd

  3. Top 7 banen die SQL vereisen

  4. hoe selecteer ik AVG van meerdere kolommen op een enkele rij?