【问题标题】:stored procedure returns wrong value存储过程返回错误值
【发布时间】:2017-03-16 04:56:13
【问题描述】:

我有一个不断给我错误答案的存储过程。我要求程序返回汽车保险的价值。我运行该程序并给我汽车保险费的总额,但如果我第 4 次运行它,它会给我 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

请帮忙..

【问题讨论】:

  • 问题:为什么这是在存储过程中而不是在应用程序代码中完成的?
  • @Galz 是一个 php 应用程序,存储过程可以完成这项工作

标签: mysql database stored-procedures procedure


【解决方案1】:
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

【讨论】:

  • 它有效!谢谢,但另一个小问题。我需要两次运行代码才能获得新值,因为不知何故,结果从第一次开始就没有更新。
  • @imohd23 不确定你的意思。您能否为此添加一个示例,那么您如何调用该过程,以及发生了什么(没有)。顺便说一句,使用函数而不是过程看起来是一个更合乎逻辑的选择 - 但话又说回来,这取决于你如何使用/调用它。
猜你喜欢
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
相关资源
最近更新 更多