Oracle序列可以为空吗?

时间:2013-12-10 12:53:13

标签: java sql spring oracle sequence-generators

我正在使用Spring运行Java应用程序,我的一个插入语句出错了。我的错误是:

  

嵌套异常是java.sql.SQLIntegrityConstraintViolationException:   ORA-01400:无法插入NULL(“MY_SCHEMA”。“VALIDATION_RESULT”。“RESULT_SEQ”)

对于所有数据库人员,Oracle是否会从null调用中返回nextval?如果多个线程同时调用它呢?

对于任何Spring开发人员,我们都在使用

org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer 

处理序列。我们使用nextLongValue方法。

我的直言告诉我甲骨文没有给我一个空nextval。从我已经搜索过的所有内容来看,这似乎是不可能的。任何人都可以确认吗?

1 个答案:

答案 0 :(得分:2)

确认。它们不返回NULL。您收到错误消息。

Oracle序列实际上会生成一个“nextval”对象块,因此线程可以快速访问它们。如果是性能障碍,您可以更改序列以创建更大的预读数值。唯一的可能性是Oracle严重受损。让您的DBA查看警报日志。 ORA-06nn错误之类的错误是DBA的噩梦,也是我所知道的唯一真正打破像序列这样的对象的东西。 在这种情况下,DB和DBA也可能接近DOA。这种事情发生在职业生涯中。

我会先怀疑你的代码。或者有人在跟踪序列 - 就像用ALTER SEQUENCE做一些蠢事。即,从一个重新启动序列并破坏表约束。当您仅从数据库DEV中导出表时,也很容易按顺序搞定事情 - >导入到数据库TEST,因为其他元数据也需要被带来。