在软件项目中,我们偶然发现了一个错误,我们从Java中插入了大量(17位数)到Oracle DB过程。数字改变了它的值有时+1或-1。有时保持不变。我们检查了oracle DB驱动程序调试日志,看到它打印了正确的数字。 我们还尝试在每个请求之间重新启动Java应用程序服务器,以消除奇怪的缓存错误。仍然得到相同的结果。
为什么会发生这种情况?
以下是代码:
// Datasource configuration
<New class="oracle.jdbc.pool.OracleDataSource">
<Set name="DriverType">thin</Set>
<Set name="URL">jdbc:oracle:thin:@xxxx</Set>
<Set name="User">uuuu</Set>
<Set name="Password">pppp</Set>
</New>
// JAVA
SimpleJdbcCall testMsg = new SimpleJdbcCall(dataSource).
withSchemaName(schema).
withCatalogName(catalog).
withProcedureName("test_msg");
public void testMessage(Long n) {
testMsg.execute(n, n, n.toString());
}
// PL_SQL
procedure test_msg(
i integer,
n number,
v varchar2
) is
log_prfx log_pkg.t_log_prfx := 'test_msg: ';
begin
g_log.log_debug(log_prfx||'i='||to_char(i));
g_log.log_debug(log_prfx||'n='||to_char(n));
g_log.log_debug(log_prfx||'v='||v);
end test_msg;
现在致电
testMessage(10000000000000005L);
testMessage(10000000000000007L);
testMessage(10000000000000009L);
最终得到像
这样的日志test_msg: i=10000000000000005
test_msg: n=10000000000000005
test_msg: v=10000000000000005
test_msg: i=10000000000000008
test_msg: n=10000000000000008
test_msg: v=10000000000000007
test_msg: i=10000000000000008
test_msg: n=10000000000000008
test_msg: v=10000000000000009
我们正在使用的版本。
答案 0 :(得分:0)
您传入的号码大于oracle的整数最大值,因此可能会出现不可预测的结果。 oracle中的max int值为2147483647.使用正确的in oracle docs
类型的数字答案 1 :(得分:0)
所以最后我从Java传递BigDecimal并在plsql中使用NUMBER(虽然整数也可以工作)。
Thanx Ivan提示!