2016-11-02 2 views
0

잘못된 대답을 계속 제공하는 저장 프로 시저가 있습니다. 나는 그 절차에 모터 보험의 가치를 되돌려달라고 요청했다. 나는 절차를 실행하고 저에게 모터 보험료의 합계를 주지만, 만약 내가 네 번째 시간 동안 그것을 실행한다면 그것은 나에게 ageRange select statement 값을줍니다. 코드를 새 프로 시저로 옮겼지만 여전히 동일합니다.저장 프로 시저가 잘못된 값을 반환합니다.

내 코드

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.

(또는 오히려 하나) 당신의 변수의 값을 설정하는 방법은 into를 사용하는 것입니다 :이 비록

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

아마 어쨌든 사람의 나이를 계산하는 가장 정확한 방법이 아닙니다. 이 저장 프로 시저에서 수행이 아닌 응용 프로그램 코드의 이유 : 당신은

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

그것은 작동합니다! 고마워하지만 또 다른 작은 질문. 어떻게 든 resault가 처음부터 업데이트되지 않기 때문에 새로운 값을 갖기 위해 코드 twise를 실행해야합니다. – imohd23

+0

@ imohd23 무슨 뜻인지 모르겠다. 예제를 추가 할 수 있습니다. 따라서 프로 시저를 호출하는 방법과 발생시키는 (수행하지 않는) 방법이 있습니다. Btw, 프로 시저 대신 함수를 사용하는 것이 더 논리적 인 선택 인 것처럼 보일 수 있습니다.하지만 다시 사용 방법에 따라 다릅니다. – Solarflare

관련 문제