2016-11-02 146 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