6

MySQL-質問

異なる条件に対して同じ結果セットを提供し、異なるテーブルを結合する 3 つのストアド プロシージャがあります。

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

上記の 3 つのストアド プロシージャの結果を返す別のストアド プロシージャが必要です。上記の 3 つのストアド プロシージャを単純に結合します。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 ;       

これを達成するための回避策はありますか。前もって感謝します。

4

1 に答える 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 ;

上記のように、次の 2 つのプロシージャを次のように作成できます。

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 ;

以下は、上記の 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 ;

最後に、マスター手順から他の結果を取得したい場合は、次のように実行できます。

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 ;
于 2013-10-31T02:58:37.083 に答える