【问题标题】:Oracle sequence.nextval returned no rowsOracle sequence.nextval 没有返回任何行
【发布时间】:2012-03-02 22:30:42
【问题描述】:

我的应用中有这个 SQL 脚本:

select my_seq.nextval from dual connect by level <= 100;

它工作得很好,但是一旦我(在日志中)看到它根本没有返回任何行。序列的值与最大值相差甚远。我想知道这怎么可能。

序列创建脚本:

CREATE SEQUENCE my_seq 
MINVALUE 1 MAXVALUE 999999999999999999999999999 
INCREMENT BY 1 START WITH 3602281 
CACHE 2000 NOORDER NOCYCLE;

【问题讨论】:

  • 你能发布序列创建脚本吗?另外,如果您选择currval 会怎样?你能在 SQL*Plus 中运行 select 并且它可以工作,它只会在你的应用程序中失败吗?
  • 几天前发生了错误,所以我现在无法进行任何测试。它现在正在工作。我确定这是数据库问题,但我需要一个证据来说服我的老板该应用运行良好。
  • 一次获取100个序列值。
  • 正如@JohnDoyle 所建议的,你能描述一下双重的吗?是 sys.dual 吗?
  • @tbone 没有明确声明,但 AFAIK 方案中没有本地 DUAL 表。

标签: oracle oracle11g sequence


【解决方案1】:

您的DUAL 表为空或者您有一个本地DUAL 表的可能性很小?试试:

select 1 from dual;

如果没有行,请尝试:

select 1 from sys.dual;

【讨论】:

  • 您可以轻松做到:create table myschema.dual(dummy varchar2(1));。或者,如果以SYS 登录或拥有权限:delete from sys.dual;
  • 那么在脚本中用 SYS.DUAL 替换 DUAL 会更安全吗?
  • 我猜是因为 SYS.DUAL 被清空是非常不寻常的(通常只有 DBA 可以这样做)但总是有可能有人可以创建它的本地版本.
  • 哇,从来没有想过这个......想到本地空双表的含义很害怕!
猜你喜欢
  • 2012-01-11
  • 1970-01-01
  • 2017-04-08
  • 2018-07-02
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 2019-04-24
  • 2012-09-11
相关资源
最近更新 更多