2016-11-02 8 views
0

私に間違った答えを与え続けているストアドプロシージャがあります。私は、自動車保険の価値を返還する手続きを尋ねました。私は手続きを実行して、私にモータ保険料の合計を与えますが、私が4回目に実行すると、ageRange select文の値が私に与えられます。 コードを新しいプロシージャに移動しましたが、それでも同じです。ストアドプロシージャが間違った値を返します

私のコード

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `cal_motor_qoute`(in 
coverID int , in dob date, 
in sumMotor double , out QMsg varchar(200)) 
BEGIN 
declare policy_cover , total , insRatio, ageExtra double; 
declare ageRange int; 
declare price_list varchar(200); 

SELECT DATEDIFF(NOW(),dob)/365.25 AS ageRange from dual; 


if (coverID = 1) then 
set policy_cover = 0.002; 
elseif (coverID = 2) then 
set policy_cover = 0.0025; 
elseif (coverID = 3) then 
set policy_cover = 0.003; 
elseif (coverID = 4) then 
set policy_cover = 0.0035; 
end if; 

if (ageRange < 25) then 
set ageExtra = 0.0005; 
else 
set ageExtra = 0.000; 
end if; 

set insRatio = policy_cover + ageExtra; 
set total = (sumMotor * insRatio)* 10; 

set QMsg = concat('total Premium is: ',total); 
select @QMsg; 
END 

任意の助けてください..

+0

if (ageRange < 25) then 

を交換したいのでしょうか? – Galz

+0

@GalzそのPHPアプリケーション、ストアドプロシージャは、仕事を完了することができます – imohd23

答えて

0
SELECT DATEDIFF(NOW(),dob)/365.25 AS ageRange from dual; 

変数ageRange設定されていないだろうが、それは(計算値の)selectを行いますとの列に名前を付けます結果セットageRange

SELECT DATEDIFF(NOW(),dob)/365.25 into ageRange from dual; 

これはおそらく、とにかく人の年齢を計算するための最も正確な方法ではありませんが:あなたの変数の値を設定する(というか1)の方法は、intoを使用することです。なぜこのストアドプロシージャではなく、アプリケーションコードで行われます。あなたは質問

if (dob > date_sub(now(), interval 25 year)) then 
+0

それは動作します!ありがとうございますが、別の小さな質問です。何らかの形でリホルトが最初から更新されていないので、新しい値を持つためにコードtwiseを実行する必要があります。 – imohd23

+0

@ imohd23あなたは何を意味するのかよく分かりません。そのための例を追加して、プロシージャをどのように呼び出すのか、何が起こらないのでしょうか。 Btw、プロシージャの代わりに関数を使用すると、これはより論理的な選択のように見えますが、再度、使用方法/呼び出し方法によって異なります。 – Solarflare

関連する問題