java - Oracle DUAL 表返回 "no rows selected"

标签 java oracle hibernate oracle11g sequence

我收到这个查询:

insert into biller_onboarding_tbl values(BILLER_ONBOARDING_ID_SEQ.NEXTVAL,'1','blah','j', '1','dsad','das','dasd','dsad','dasd','dasd','dsadsa')

1 rows inserted.

select * from BILLER_ONBOARDING_TBL;

返回所有行 -

select BILLER_ONBOARDING_ID_SEQ.NEXTVAL from dual;

no rows selected

为什么会发生这种情况?

最佳答案

select BILLER_ONBOARDING_ID_SEQ.NEXTVAL from dual;

双表可能为空。凭借 SYSDB 权限,您可以删除/截断SYS.DUAL 表。

但是,即使 Dual 不返回任何行,您仍然会获得 sequence.nextval 值。 优化器在某种程度上肯定会始终从双表中获取行

SQL> conn sys@pdborcl as sysdba
Enter password:
Connected.
SQL> show user
USER is "SYS"
SQL> select * from dual;

D
-
X

SQL> delete from dual;

1 row deleted.

SQL> commit;

Commit complete.

SQL> select * from dual;

no rows selected

因此,双表没有行

让我们创建一个序列并进行测试:

SQL> create sequence s;

Sequence created.

SQL> select s.nextval from dual;

   NEXTVAL
----------
         1

SQL> select * from dual;

no rows selected

SQL> select s.nextval from dual;

   NEXTVAL
----------
         2

解释计划显示FAST DUAL操作仍然获取一行:

SQL> explain plan for select s.nextval from dual;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------
Plan hash value: 3499163060

-----------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     1 |     2   (0)| 00:00:01 |
|   1 |  SEQUENCE        | S    |       |            |          |
|   2 |   FAST DUAL      |      |     1 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------

9 rows selected.

SQL>

注意:DUAL是一个特殊的表,属于SYS。它是数据字典的一部分。操作数据字典并不是一个好主意。不推荐。

如果双表尚未被操作,那么您应该能够从 dba_objects 看到以下输出:

SQL> column owner format a15
SQL> column object_name format a15
SQL> column object_type format a15
SQL> SELECT owner, object_name, object_type FROM dba_objects WHERE object_name='DUAL';

OWNER           OBJECT_NAME     OBJECT_TYPE
--------------- --------------- ---------------
SYS             DUAL            TABLE
PUBLIC          DUAL            SYNONYM

SQL>

在您的情况下,可能已经创建了一个名为 DUAL 的自定义表,并且该表不包含任何行。

如果是这种情况,并且 SYS.DUAL 尚未被操作,则尝试使用:

select BILLER_ONBOARDING_ID_SEQ.NEXTVAL from SYS.dual;

关于java - Oracle DUAL 表返回 "no rows selected",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30342277/

相关文章:

java - 如何修复身份始终返回 0 的 HSQL DataSource + TxM

java - 如何加快oracle普通语句批量操作?

mysql - Hibernate能够连接到mysql,但Spring JPA不能连接

java - 两个 Joda DateTime 之间的差异(以月为单位)和剩余天数

java - 运行和调试程序 Java、Eclipse 的不同行为

oracle - 通过 Hibernate 获取 PL/SQL 函数的返回值

mysql - 关于这些的 SQL 问题

java - 我应该如何使用 Hibernate 从 JPQL 查询中引用内部枚举(在实体中定义)?

java - RichFaces 4 webapp 的引用架构

java - 无法让 PFX/SSL 在 Tomcat 中工作