Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当序列号存储在Java变量中时,Oracle Sequence generator返回负值_Java_Oracle_Spring Jdbc_Jdbctemplate - Fatal编程技术网

当序列号存储在Java变量中时,Oracle Sequence generator返回负值

当序列号存储在Java变量中时,Oracle Sequence generator返回负值,java,oracle,spring-jdbc,jdbctemplate,Java,Oracle,Spring Jdbc,Jdbctemplate,我有一个名为Record ID的数据库列。这是一个主键,其值是使用具有以下属性的oracle序列生成的 序列细节 最小值:1 最大值:999999999999999999999999 增量:10 在我的Java应用程序中,我在应用一些业务逻辑后将记录插入表中。字段记录ID的值来自序列生成器 在插入记录之前,在Java代码中,我首先用下面的代码(从序列生成器获得)在Java长变量中设置它的ID recordID值显示为-8742538778(在我从序列生成器收到该值之后),它前面有一个减号 我需要

我有一个名为Record ID的数据库列。这是一个主键,其值是使用具有以下属性的oracle序列生成的 序列细节 最小值:1 最大值:999999999999999999999999 增量:10

在我的Java应用程序中,我在应用一些业务逻辑后将记录插入表中。字段记录ID的值来自序列生成器

在插入记录之前,在Java代码中,我首先用下面的代码(从序列生成器获得)在Java长变量中设置它的ID

recordID值显示为-8742538778(在我从序列生成器收到该值之后),它前面有一个减号


我需要确保没有收到负值。我不确定根本原因,也需要相同的解决方案来排除故障。请尝试以下步骤

检查序列

连接应用程序用户并运行以下查询:

select SEQUENCE_OWNER, SEQUENCE_NAME, MIN_VALUE, MAX_VALUE, INCREMENT_BY, CACHE_SIZE, LAST_NUMBER
from all_sequences 
where SEQUENCE_NAME = 'RECORD_ID_SEQ';

SEQUENCE_OWNER                 SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE                   INCREMENT_BY CACHE_SIZE LAST_NUMBER
------------------------------ ------------------------------ ---------- ---------------------------- ------------ ---------- -----------
<owner>                        RECORD_ID_SEQ                           1 9999999999999999999999999999           10         20     1202020
摘要

负值的问题很可能出现在
SELECT\u EVENT\u LOG\u SEQUENCE\u SQL
查询中(您没有显示)

进一步建议

在为
ID
列使用
Long
类型时,请将序列的MAX_值调整为
Long
的MAX值,以了解更多讨论


如果您希望大量使用序列,请不要使用
INCREMENT\u BY
10,而是在Marmite Bomber指出问题可能在SQL中后继续使用
1
。作出以下更正 之前
public void saveRecordData(Long RecordId,RecordLog RecordLog){Object[]参数={RecordId,RecordLog.getRouteId(),RecordLog.getRecordType().getRecordTypeId(),RecordLog.getIncomingRecordTimestamp(),RecordLog.getOutgoingRecordTimestamp(),RecordLog.getStatus()};int[]类型={Types.INTEGER、Types.INTEGER、Types.VARCHAR、Types.TIMESTAMP、Types.TIMESTAMP、Types.VARCHAR};int rowsAffected=jdbcTemplate.update(INSERT_Record_LOG_SQL、参数、类型);}


之后(将SQL类型从TYPES.INTEGER更改为TYPES.BIGINT)
public void saveRecordData(Long RecordId,RecordLog RecordLog){Object[]参数={RecordId,RecordLog.getRouteId(),RecordLog.getRecordType().getRecordTypeId(),RecordLog.getIncomingRecordTimestamp(),RecordLog.getOutgoingRecordTimestamp(),RecordLog.getStatus()};int[]types={types.BIGINT,types.INTEGER,types.VARCHAR,types.TIMESTAMP,types.VARCHAR};int-rowsAffected=jdbcTemplate.update(插入_-Record_-LOG_-SQL,参数,类型);}

如果它增加10,为什么最后一个序列号是8?无论如何:如果序列号正确,则对该值应用ABS函数(或将其乘以-1)你会得到一个正数。这就是我所能说的,关于我不懂Java。如果这个序列应该为表提供PK,那么不要让你的应用程序尝试捕获和使用它。只需在表上创建一个触发器来提取序列并提供它。或者如果你的db版本是12c或更高,请定义PK作为一个标识列,让Oracle叔叔为您处理。对于您提出的建议“负值的问题最有可能出现在SELECT_EVENT_LOG_SEQUENCE_SQLquery中”。这很有帮助。就在更新查询之前,定义的SQL类型是types.INTEGER,应该是types.BIGINT
select SEQUENCE_OWNER, SEQUENCE_NAME, MIN_VALUE, MAX_VALUE, INCREMENT_BY, CACHE_SIZE, LAST_NUMBER
from all_sequences 
where SEQUENCE_NAME = 'RECORD_ID_SEQ';

SEQUENCE_OWNER                 SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE                   INCREMENT_BY CACHE_SIZE LAST_NUMBER
------------------------------ ------------------------------ ---------- ---------------------------- ------------ ---------- -----------
<owner>                        RECORD_ID_SEQ                           1 9999999999999999999999999999           10         20     1202020
Caught: org.springframework.jdbc.UncategorizedSQLException: 
StatementCallback; uncategorized SQLException for SQL [SELECT RECORD_ID_SEQ.NEXTVAL FROM DUAL]; 
SQLstate [99999];
error code [17026]; 
Numeric Overflow; 
nested exception is java.sql.SQLException: Numeric Overflow