gpt4 book ai didi

oracle - pl/sql 程序员在计算货币时常犯的错误是什么?

转载 作者:行者123 更新时间:2023-12-04 01:52:34 25 4
gpt4 key购买 nike

您好,我正在寻找 pl/sql 程序员在编写处理大量货币计算的应用程序时所犯的常见错误。 (折扣、税收、税率等)
据我所知,我一直在使用 java 和 hibernate 进行货币计算,java 有一套规则和最佳实践,比如 BigDecimal 来保持精度等。现在我正在努力提高我在处理金融模块方面的 pl/sql 技能这就是为什么我想知道这个陷阱并避免它们。还有任何现有的口头禅或 pl/sql 最佳实践吗?
提前谢谢各位。

最佳答案

使用这个例子:

create table t_val
(id number(10,0),
value number(5,2));

declare
v_dummy number;
begin
delete from t_val;
for i in 9 .. 20 loop
insert into t_val values (i, 1/i);
select count(*)
into v_dummy
from t_val
where value = 1/i;
dbms_output.put_line(to_char(i,'00')||':'||v_dummy||':'||
to_char(1/i,'000.999999'));
end loop;
--
end;
/

select id, value from t_val order by 1;

您可以看到代码插入,例如 0.11111 隐式四舍五入为 0.11
当代码立即尝试计算 0.11111 的值时,它找不到任何匹配项。

同样, (1/14) 和 (1/15) 的值都四舍五入为 0.07。

这不是特定于 PL/SQL 的问题,我在 Java 和 PHP 代码中看到了类似的问题,当“客户端”中的值在进入数据库时​​被四舍五入。不过,PL/SQL 确实提供了更好的解决方案,因为您可以声明特定表/列类型的变量,并且即使列发生更改,该绑定(bind)也会保持不变。
declare
v_value t_val.value%type;
v_dummy number;
begin
delete from t_val;
for i in 9 .. 20 loop
v_value := 1/i;
insert into t_val values (i, v_value);
select count(*)
into v_dummy
from t_val
where value = v_value;
dbms_output.put_line(to_char(i,'00')||':'||v_dummy||':'||
to_char(1/i,'000.999999')||':'||to_char(v_value,'000.999999'));
end loop;
--
end;
/

因此,最佳实践是,在处理 SQL 语句时,使用锚定到基础表的类型(包括长度/比例/精度)的绑定(bind)变量。

关于oracle - pl/sql 程序员在计算货币时常犯的错误是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7199344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com