2012-03-28 16 views
2

これは、それがない場合はnull値を保つコードなぜこの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

w1w2、およびqd変数をFLOATとして宣言していますが、それらに文字列を割り当てています。その結果、3つすべてで0.0が得られます。次に0.0/0.0hasilに割り当て、0で割ると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

この作業罰金:) かなり暴露の –

1

を探しているのだと思う - W2、彼らはフィールドと同じであってはならない、

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の名前を変更名前。

+0

この作業罰金、:)私は今正常に動作し、変数名に –

1

Setステートメントは、クエリ結果を変数に割り当てません。この場合、クエリ文字列を割り当てます。これは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

感謝を変更します感謝:) –

+0

user1297348 @あなたは更新を見ましたか?あなたは* one * singleクエリでそれを行うことができます。 –

+0

そんなにタイプすることはできません。再度、感謝します :) –

関連する問題