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

MySQL erstellt eine gespeicherte Prozedur aus mehreren gespeicherten Prozeduren

Wie ich denke, ist die obige Funktion nicht in MySQL implementiert. Siehe hier für weitere Informationen.

Ich bin auf folgende Lösung gekommen. Aber ich bin mir nicht sicher, ob es der beste Ansatz für dieses Problem ist.

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 ;

Wie oben können Sie die nächsten beiden Prozeduren wie folgt erstellen.

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 ;

Das Folgende ist also die Hauptprozedur, die eine Vereinigung der oben genannten 3 Prozeduren ist.

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 ;

Also schließlich, wenn Sie andere Ergebnisse aus dem Master-Verfahren erhalten möchten, können Sie wie folgt vorgehen.

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 ;