2012-03-28 262 views
2

所以這是代碼爲什麼這個mysql函數保持返回零值?

CREATE FUNCTION smc() RETURNS FLOAT 
    DETERMINISTIC 
    BEGIN 
DECLARE w1 FLOAT; 
DECLARE w2 FLOAT; 
DECLARE qd FLOAT; 
DECLARE hasil FLOAT; 

SET w1  = "SELECT TRUNCATE(SQRT(SUM((w1*w1))),2) FROM tb_term"; 
SET w2  = "SELECT TRUNCATE(SQRT(SUM((w2*w2))),2) FROM tb_term"; 
SET qd  = "SELECT TRUNCATE(SUM(w1*w2),2) FROM tb_term"; 
SET hasil = (qd/(w1*w2)); 
RETURN hasil; END; 

保持它的返回空值。當我返回w1,w2或qd時,它返回0值。怎麼了 ? 以前感謝。

回答

1

您正在聲明您的w1,w2qd變量爲FLOAT,但您正在爲其分配字符串;結果是你在所有三個中都得到了0.0。然後,您將0.0/0.0分配給hasil,除以零會得到NULL。

我認爲你正在尋找

SELECT TRUNCATE(SQRT(SUM((w1*w1))),2) into w1 FROM tb_term; 
SELECT TRUNCATE(SQRT(SUM((w2*w2))),2) into w2 FROM tb_term; 
SELECT TRUNCATE(SUM(w1*w2),2) into qd FROM tb_term; 
+0

這個工作的罰款:) 相當發人深省 – 2012-03-28 06:59:29

1

嘗試重寫你的函數以這種方式 -

CREATE FUNCTION smc() 
RETURNS FLOAT 
DETERMINISTIC 
BEGIN 
    DECLARE w1 FLOAT; 
    DECLARE w2 FLOAT; 
    DECLARE qd FLOAT; 
    DECLARE hasil FLOAT; 

    SELECT truncate(sqrt(sum((w1 * w1))), 2) INTO w1 FROM tb_term; 
    SELECT truncate(sqrt(sum((w2 * w2))), 2) INTO w2 FROM tb_term; 
    SELECT truncate(sum(w1 * w2), 2) INTO qd FROM tb_term; 
    SET hasil = (qd/(w1 * w2)); 
    RETURN hasil; 
END 

,並重新命名聲明的變量W1,W2,他們不應該是一樣的場名。

+0

這個工作很好,謝謝:)我會改的變量名 – 2012-03-28 07:00:07

1

設置語句不會將查詢結果分配給變量。在這種情況下,它只是分配查詢字符串。您可以通過SELECT INTO聲明來執行此操作。

SELECT 
    TRUNCATE(SQRT(SUM((w1*w1))),2), 
    TRUNCATE(SQRT(SUM((w2*w2))),2), 
    TRUNCATE(SUM(w1*w2),2) 
INTO w1, w2, qd 
FROM tb_term 
+0

感謝,現在工作的罰款:) – 2012-03-28 07:00:34

+0

@ user1297348你看到的更新?您可以在* one *單個查詢中執行此操作。 – 2012-03-28 07:07:25

+0

是的。不知道它可以通過這種方式鍵入。再次感謝 :) – 2012-03-28 14:36:13