我们的合作伙伴数据库有时会收到以下错误:
<i>ORA-01438: value larger than specified precision allows for this column</i>
Run Code Online (Sandbox Code Playgroud)
完整响应如下所示:
<?xml version="1.0" encoding="windows-1251"?>
<response>
<status_code></status_code>
<error_text>ORA-01438: value larger than specified precision allows for this column ORA-06512: at "UMAIN.PAY_NET_V1_PKG", line 176 ORA-06512: at line 1</error_text>
<pay_id>5592988</pay_id>
<time_stamp></time_stamp>
</response>
Run Code Online (Sandbox Code Playgroud)
导致此错误的原因是什么?
在我的应用程序中,我将数字处理为BigDecimal并将它们存储为NUMBER(15,5).现在我需要正确检查Java是否BigDecimal值适合列,以便我可以生成正确的错误消息而不执行SQL,捕获异常并验证供应商错误代码.我的数据库是Oracle 10.3,这样的错误导致错误1438.
经过一些谷歌搜索,我发现没有这样的代码,所以我想出了自己的.但是我对这段代码真的不满意......很简单,但同时又简单到足以怀疑它的正确性.我用很多值,随机和边界测试它,它似乎工作.但是由于我对数字非常不满意,我想要一些更强大且经过良好测试的代码.
//no constants for easier reading
public boolean testBigDecimal(BigDecimal value) {
if (value.scale() > 5)
return false;
else if (value.precision() - value.scale() > 15 - 5)
return false;
else
return true;
}
Run Code Online (Sandbox Code Playgroud)
编辑:最近的测试没有超出规模的数字的例外,只是默默地舍入,我不知道没有和我做这些第一次测试之间有什么不同.这样的舍入是不可接受的,因为应用程序是财务的,并且任何舍入/截断必须是显式的(通过BigDecimal方法).除了例外之外,这种测试方法必须确保数字对于期望的精度而言不是太大,即使是非有效数字.对于迟到的澄清感到抱歉.
谢谢你的时间.
我仍然对这个问题感到好奇.我的代码仍在运行,我没有得到正确或失败情况的一些"证据",或者这种测试的一些标准代码.
所以,我正在给它一个赏金,希望得到任何这些.
以下是我的代码,我不明白我做错了什么.任何帮助将不胜感激
CREATE OR REPLACE
PROCEDURE COMP_LATE_FEE(LATE_APT_FINE IN NUMBER, LATE_GRG_FINE IN NUMBER)
AS
DIFF NUMBER;
TYPE MBCUR IS REF CURSOR RETURN MONTHLY_BILL%ROWTYPE;
MONBILL MBCUR;
MBREC MONTHLY_BILL%ROWTYPE;
BEGIN
--DIFF := FLOOR(SYSDATE - (TRUNC(SYSDATE,'MM')));
--DBMS_OUTPUT.PUT_LINE(DIFF);
OPEN MONBILL FOR
-- checking the status of all last month's bills
SELECT * FROM MONTHLY_BILL
WHERE STATUS = 'PENDING' AND SYSDATE > ED_DT;
FETCH MONBILL INTO MBREC;
-- adding the late fee amount for any bills that are past the due date
-- due date = last …
Run Code Online (Sandbox Code Playgroud)