我收到这个查询:
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/