2016-10-07 8 views
0

私は4つのSPを持っています。 get_revenueget_hotel_revenueget_region_revenueget_division_revenueMySQLの連鎖呼び出しストアドプロシージャを返す方法は?

だからget_revenueは、第3の他のSPに供給するための正しいデータを選択します。 以下は私がしようとしているものです:

SELECT @hotel_id := hotel.hotel_id, @region_id := region_id, @division_id := division_id FROM campaign 
LEFT JOIN hotel ON campaign.hotel_id = hotel.id 
WHERE campaign.id = campaign_id; 

#This is the part that doesnt return anything. 
CALL get_hotel_revenue(@hotel_id); 
CALL get_region_revenue(@region_id); 
CALL get_division_revenue(@division_id); 

しかし、結果は唯一の3つの変数を返します。 3つのネストされたSPから3つの結果を得るにはどうすればよいですか?

ここでは他の2

DELIMITER ;; 
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_division_revenue`(IN division_id INT(11)) 
BEGIN 
    SELECT sum(revenue) FROM data 
    WHERE data.property_id IN 
    (
    SELECT hotel_id FROM hotel 
    WHERE hotel.division_id = division_id 
); 
END;; 
DELIMITER ; 

答えて

0

OUT変数として二番目のパラメータを追加しますと類似しているget_division_revenueのためのSPです:その後

DELIMITER ;; 
CREATE PROCEDURE `get_division_revenue`(IN division_id INT(11), OUT out_result int) 
BEGIN 
    -- and store the query result in that variable 
    SET out_result = (
     SELECT sum(revenue) FROM data 
     WHERE data.property_id IN 
     (
     SELECT hotel_id FROM hotel 
     WHERE hotel.division_id = division_id 
    ) 
    ); 

END;; 
DELIMITER ; 

を、セッションを追加し、あなたの最初のストアドプロシージャを変更するには変数:

-- Create the session variables before call procedures 
set @hotel_revenue = null; 
set @region_revenue = null; 
set @division_revenue = null; 

-- Now you can acll the procedures with those variables 
CALL get_hotel_revenue(@hotel_id,@hotel_revenue); 
CALL get_region_revenue(@region_id,@region_revenue); 
CALL get_division_revenue(@division_id,@division_revenue); 

今すぐ@hotel_revenue@region_revenueおよび@division_revenueには、必要に応じて各ストアドプロシージャの結果があります。あなたの手順の終わりに

は、その変数を選択を追加します。

SELECT @hotel_revenue as hotel_revenue, 
    @region_revenue as region_revenue, 
    @division_revenue as division_revenue; 
+0

@restingを、私は、最終的なSQLに –

+0

感謝を追加するのを忘れ、私の答えを編集しました。私は実際に個別にSPを呼び出すようになりましたが、あなたのソリューションは理にかなっています。最終結果は次のようになります:https://paste.ee/p/YP1GW ya? – resting

関連する問題