Vir*_*ths 5 mysql union stored-procedures
我有三个存储过程,它们为不同的条件和连接不同的表提供相同的结果集。
前任
procedure_one(StartDate,EndDate);
procedure_two(StartDate,EndDate);
procedure_three(StartDate,EndDate);
Run Code Online (Sandbox Code Playgroud)
我需要另一个存储过程,它将给出上述三个存储过程的结果。以上三个存储过程的简单联合。我不想要 3 个查询的联合,而是想要 3 个存储过程的联合。我用谷歌搜索但无法找到好的解决方案。
我做了以下尝试。
第一次尝试
DELIMITER //
CREATE PROCEDURE `MasterProcedure` (IN StartDate DATE,IN EndDate DATE)
BEGIN
SELECT @CALL procedure_one (StartDate,EndDate) UNION
SELECT @CALL procedure_two (StartDate,EndDate) UNION
SELECT @CALL procedure_three (StartDate,EndDate);
END //
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
第二次尝试
DELIMITER //
DECLARE var_val1 TEXT;
DECLARE var_val2 TEXT;
DECLARE var_val3 TEXT;
CREATE PROCEDURE `MasterProcedure` (IN StartDate DATE,IN EndDate DATE)
BEGIN
SELECT @CALL procedure_one (StartDate,EndDate) INTO @var_val1;
SELECT @CALL procedure_two (StartDate,EndDate) INTO @var_val2;
SELECT @CALL procedure_three (StartDate,EndDate) INTO @var_val3;
SELECT @var_val1,@var_val2,@var_val3;
END //
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
是否有任何解决方法来实现这一目标。提前致谢。
我认为 MySQL 中没有实现上述功能。浏览此处获取更多信息。
我想出了以下解决方案。但不确定这是解决这个问题的最佳方法。
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 ;
Run Code Online (Sandbox Code Playgroud)
如上所述,您可以创建接下来的两个过程,如下所示。
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 ;
Run Code Online (Sandbox Code Playgroud)
以下是主程序,它是上述 3 个程序的并集。
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 ;
Run Code Online (Sandbox Code Playgroud)
所以最后,如果您想从主程序中获得任何其他结果,您可以执行以下操作。
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 ;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4359 次 |
| 最近记录: |