2016-11-02 163 views
0

我有一個存儲過程,不斷給我錯誤的答案。我問過程返回汽車保險的價值。我運行這個程序,給我所有的汽車保險費,但如果我第四次運行它,它會給我ageRange選擇聲明的價值。 我將代碼移入新程序,但仍然相同。存儲過程返回錯誤值

我的代碼

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

問:這是爲什麼在存儲過程中完成的,而不是在應用程序代碼? – Galz

+0

@Galz它的一個PHP應用程序,存儲過程可以完成作業 – imohd23

回答

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

不會設置變量ageRange,但它會做select(計算值)和名稱的列結果集ageRange

的(或者說:一個)的方式來設置變量的值是使用into

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

雖然這可能不是計算人的年齡反正最精確的方式。你可能想更換

if (ageRange < 25) then 

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

它的作品!謝謝,但另一個小問題。我需要按順序運行代碼以獲得新值,因爲在某種程度上,resault不是從第一次更新。 – imohd23

+0

@ imohd23不確定你的意思。你能否爲此添加一個例子,所以你如何調用這個過程,以及什麼(不)發生。順便說一句,使用函數而不是過程看起來像是一個更合乎邏輯的選擇 - 但是,這又取決於你如何使用/調用它。 – Solarflare