将多个存储过程合并为一个MySQL存储过程

6

MySQL-问题

我有三个存储过程,针对不同的条件和加入不同的表,会得到相同的结果集。

例如:

procedure_one(StartDate,EndDate);
procedure_two(StartDate,EndDate);
procedure_three(StartDate,EndDate);

我需要另一个存储过程,它将从上述三个存储过程中提供结果。简单地说,就是上述三个存储过程的联合。我不想要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 ; 

第二次尝试

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 ;       

有没有任何解决办法来实现这个。提前感谢。

1
存储过程是否返回标量值?有哪些返回值的存储过程? - wchiquito
@wchiquito 它们将返回结果集,例如名称、日期、发货日期、订单号、发票号等。 - Viraths
我认为MySQL目前不支持你所需要的功能。尝试一种新的方法来实现你的需求。 - wchiquito
@wchiquito 谢谢兄弟。看起来好像不支持。我会尝试找到替代方案。 - Viraths
1个回答

2

我认为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 ;

如上所述,您可以按照以下方式创建下面两个过程。
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 ;

所以以下是主过程,它是以上三个过程的集合。
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 ;

最后,如果您想从主过程中获取其他结果,可以按照以下步骤进行操作。

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 ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接