2013-12-11 169 views
0

我是新來的mysql,我試圖在存儲過程(有點像嵌套存儲過程)中使用多個存儲過程。我的得到的輸出是設定任何幫助空,將不勝感激存儲過程中的多個存儲過程,只返回第一個存儲過程輸出變量

我的存儲的過程代碼塊


Outer stored Procedure 

DELIMITER $$ 
USE `test`$$ 

DROP PROCEDURE IF EXISTS `GetHsi`$$ 
CREATE DEFINER=`root`@`localhost` 
PROCEDURE `GetHsi` 
(
IN subregion VARCHAR(255), 
OUT inc DOUBLE, 
OUT dcl DOUBLE 
) 
BEGIN 
CALL GetSubrgnSntmt('I', subregion, @Inc_Sntmt); 
CALL GetSubrgnSntmt('D', subregion, @Dec_Sntmt); 

SELECT @Inc_Sntmt INTO inc; 
SELECT @Dcln_Sntmt INTO Dcl; 
SELECT inc, dcl; 

END$$ 
DELIMITER ; 

inner stored Procedure 

USE `test`$$ 
DROP PROCEDURE IF EXISTS `GetSubrgnSntmt`$$ 
CREATE DEFINER=`root`@`localhost` 
PROCEDURE `GetSubrgnSntmt` 
(
IN Sntmt VARCHAR(25), 
IN subregion VARCHAR(255), 
OUT sub_Sntmt INT 
) 
BEGIN 

DECLARE Total INT DEFAULT 1; 
DECLARE subtotal INT DEFAULT 1 ; 
DECLARE sub_sntmt DOUBLE DEFAULT 1; 

SELECT COUNT(Cust_Id) INTO Total 
FROM test.`jnk_test` 
WHERE buy_cty = subregion ; 

SELECT COUNT(Cust_Id) INTO subtotal 
FROM test.`jnk_test` 
WHERE Sntmt_2 =Sntmt 
AND buy_cty = subregion ; 

SET sub_Sntmt = (subtotal/total) * 100; 
SELECT sub_sntmt; 

END$$ 
DELIMITER 

Output 

CALL gethsi('central hyderabad',@inc, @dcl); 
SELECT @inc, @dcl; 

=========== 
@inc| @dcl 
=========== 
null| null 

我打這個並不能在這個時刻繼續我不知道我要去的地方錯了好心的幫助。

+1

請不要標記與SQL Server MySQL的問題。 –

+0

您需要回答的第一個問題是內部過程是否在自己調用時正常工作。你在變量中進行一些不必要的變換,並且你的標識符有一些不匹配的地方(例如Total和Total),但是這些東西都不應該破壞代碼。內部過程本身是否正常工作? –

+0

嗨亞倫,謝謝你指出,我將不會在未來mis mis tagging ..謝謝 –

回答

0

問題出在內部存儲過程。輸出參數OUT sub_Sntmt INT也被定義爲局部變量DECLARE sub_sntmt DOUBLE DEFAULT 1;。一種選擇是刪除局部變量。

13.1.15. CREATE PROCEDURE and CREATE FUNCTION Syntax

  • 參數名不區分大小寫。

13.6.4.1. Local Variable DECLARE Syntax

  • 局部變量名不區分大小寫。

還檢查數據類型的定義以避免問題。

CREATE PROCEDURE `GetSubrgnSntmt`(
IN `Sntmt` VARCHAR(25), 
IN `subregion` VARCHAR(255), 
OUT `sub_Sntmt` INT 
) 
BEGIN 
    DECLARE `Total` INT DEFAULT 1; 
    DECLARE `subtotal` INT DEFAULT 1; 
    -- DECLARE `sub_sntmt` DOUBLE DEFAULT 1; 

    SELECT COUNT(`Cust_Id`) INTO `Total` 
    FROM `jnk_test` 
    WHERE `buy_cty` = `subregion`; 

    SELECT COUNT(`Cust_Id`) INTO `subtotal` 
    FROM `jnk_test` 
    WHERE `Sntmt_2` = `Sntmt` 
    AND `buy_cty` = `subregion`; 

    SET `sub_Sntmt` := (`subtotal`/`total`) * 100; 
END$$ 

DELIMITER ; 

SQL Fiddle demo

+0

Wchiquito,....這簡直太棒了...代碼像寶石一樣工作......感謝大家爲我的週末做準備 –