Oracle 序列可以为空吗?

Posted

技术标签:

【中文标题】Oracle 序列可以为空吗?【英文标题】:Can an Oracle Sequence ever be null? 【发布时间】:2013-12-10 12:53:13 【问题描述】:

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

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

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

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

org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer 

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

我的直觉告诉我,Oracle 没有给我一个空的nextval。从我已经搜索过的所有内容来看,这似乎是不可能的。谁能确认一下?

【问题讨论】:

【参考方案1】:

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

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

我会首先怀疑您的代码。或者有人修补序列——比如用 ALTER SEQUENCE 做一些愚蠢的事情。即,从一个重新开始序列并打破表约束。当您只从数据库 DEV 导出表 -> 导入数据库 TEST 时,也很容易按顺序搞砸事情,因为其他元数据也需要带过来。

【讨论】:

感谢您的回复。更改序列不是一个选项,因为我知道代码不使用它,即使我们尝试过,我们的用户也没有权限。我没有在原始帖子中包含此内容,但代码有时确实有效。我无法查明根本原因,但它看起来确实与代码相关。我会要求我的 DBA 查看日志并进行检查。谢谢。

以上是关于Oracle 序列可以为空吗?的主要内容,如果未能解决你的问题,请参考以下文章

mongo 非主键 objectid 可以为空吗

外键可以为空吗? [复制]

整数列可以为空吗?

我们可以在 info.plist 中为键 NSPhotoLibraryAddUsageDescription 保留描述为空吗?

我们可以在 info.plist 中为键 NSPhotoLibraryAddUsageDescription 保留描述为空吗?

Java varargs 可以为空吗? [复制]