【问题标题】:Mysql make a stored procedure from multiple stored proceduresMysql 从多个存储过程中创建一个存储过程
【发布时间】:2013-10-25 03:17:00
【问题描述】:

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 ;       

是否有任何解决方法来实现这一点。提前致谢。

【问题讨论】:

  • 存储过程是否返回标量值?什么返回存储过程?
  • @wchiquito 他们将返回结果集,如名称、日期、发货日期、订单号、发票号等。
  • 我认为 MySQL 目前不支持你需要的东西。尝试一种新方法来满足您的需求。
  • @wchiquito 谢谢兄弟。好像不支持。我会尝试寻找替代方案。

标签: mysql stored-procedures union


【解决方案1】:

我认为 MySQL 中没有实现上述功能。请参阅here 了解更多信息。

我想出了以下解决方案。但不确定这是解决此问题的最佳方法。

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 ;

【讨论】:

    猜你喜欢
    • 2017-06-19
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2016-11-11
    • 2017-10-14
    相关资源
    最近更新 更多