TO_CHAR 在存储过程中没有正确比较

问题描述

我正在使用 Oracle,我需要在需要 TO_CHAR() 的地方执行一些数学计算。

但这不是比较值。

这是下面的示例。

IF TO_CHAR(V_APP_FAIR_RENT,'99,9999') > TO_CHAR(v_ACT_RENTAMT,9999')
 THEN
 V_HIGHER_RENT_PREMIUM := 0;
dbms_output.put_line('Higher Rental premium 0 :' || V_HIGHER_RENT_PREMIUM);
ELSE
V_HIGHER_RENT_PREMIUM := v_ACT_RENTAMT / V_AMTINMONTH;
V_HIGHER_RENT_PREMIUM := V_HIGHER_RENT_PREMIUM * V_NOOFDAYSINMONTH;
V_HIGHER_RENT_PREMIUM := V_HIGHER_RENT_PREMIUM - V_APP_FAIR_RENT;
V_HIGHER_RENT_PREMIUM :=  ROUND(V_HIGHER_RENT_PREMIUM / V_NOOFOPCO);
dbms_output.put_line('Higher rental premium  1 :' || V_HIGHER_RENT_PREMIUM);
END IF;

两个比较的值如下。

V_APP_FAIR_RENT = 7455v_ACT_RENTAMT = 10928

从技术上看,上面的比较应该在 IF 条件下,但实际上它在 ELSE 条件下。

请指出我哪里出错了。

解决方法

如果如您所说的原始列是字符串(为什么?),并且您的示例似乎不包含组字符或小数字符,那么为什么不使用具有默认格式的 to_number 来比较数值?

IF to_number(V_APP_FAIR_RENT) > to_number(V_ACT_RENTAMT)
THEN
    V_HIGHER_RENT_PREMIUM := 0;
    dbms_output.put_line('Higher Rental premium 0 :' || V_HIGHER_RENT_PREMIUM);
ELSE
    V_HIGHER_RENT_PREMIUM := v_ACT_RENTAMT / V_AMTINMONTH;
    V_HIGHER_RENT_PREMIUM := V_HIGHER_RENT_PREMIUM * V_NOOFDAYSINMONTH;
    V_HIGHER_RENT_PREMIUM := V_HIGHER_RENT_PREMIUM - V_APP_FAIR_RENT;
    V_HIGHER_RENT_PREMIUM :=  ROUND(V_HIGHER_RENT_PREMIUM / V_NOOFOPCO);
    dbms_output.put_line('Higher rental premium  1 :' || V_HIGHER_RENT_PREMIUM);
END IF;
,

正如@pmdba 所说,你为什么要转换已经是数字的东西(是吗?),以进行比较?

如果您执行查询:

select TO_CHAR(7455,'99,9999'),TO_CHAR(10928,9999') from dual

结果是字符串:“7455”“1,0928”。

一个有千位分隔符,另一个没有。所以你不是在比较数值,在这种情况下,字符串表示不能用于比较。

如果你仍然一心想转换,你需要去掉逗号分隔符:

select TO_CHAR(7455,'999999'),'999999') from dual

也许您可以编辑您的问题以显示如何定义这些变量以确定您要完成的任务。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...