Java “Oracle双表返回”;“未选择任何行”;

Java “Oracle双表返回”;“未选择任何行”;,java,oracle,hibernate,oracle11g,sequence,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

我得到了这个问题:

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
为什么会这样

从dual中选择BILLER_ONBOARDING_ID_SEQ.NEXTVAL

双表可能是空的。使用
SYSDB
权限,您可以删除/截断SYS.DUAL

但是,即使dual不返回任何行,您仍将获得
序列.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
解释计划显示快速双重操作仍然获取一行:

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_对象的以下输出:

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;
试试这个

select BILLER_ONBOARDING_ID_SEQ.NEXTVAL from SYS.dual;
数据库中有一个自定义表
DUAL
。因此,私有同义词可能指向您的表版本,而不是
SYS.DUAL

因此,使用模式名
SYS
查询
DUAL
,将解决tht问题

SELECT OWNER,TABLE_NAME FROM ALL_TABLES WHERE TABLE_NAME = 'DUAL';
此查询将列出一个不在
SYS
schema中的表

编辑:

从评论中,我们可以推断您正在寻找


另一方面,
PL/SQL
解决方案类似于在INSERT中使用
RETURNING
子句

SET SERVEROUTPUT ON
DECLARE
  l_id t1.id%TYPE;
BEGIN
  INSERT INTO t1 VALUES (t1_seq.nextval, 'FOUR')
  RETURNING id INTO l_id;
  COMMIT;

  DBMS_OUTPUT.put_line('ID=' || l_id);
END;
/
ID=4

PL/SQL procedure successfully completed.

SQL>

欢迎请查看和。从
dual
中选择应始终返回一行,
select*from dual
是否按预期工作?!?是,从双重选择中选择*,同时返回“未选择行”“。发布
从SYS.DUAL中选择*的结果。这将确认是否有人操纵了
sys.dual
。我记得几十年前通过插入第二行获得了乐趣。至少它的名字叫DUAL:-)Lalit,谢谢你的详细解释。实际上,我需要它用于hibernate生成的查询,该查询在“插入到”之前执行。下面是一个查询——“Hibernate:select BILLER\u ONBOARDING\u ID\u SEQ.nextval from dual”,我创建了另一个用户,该用户被传递给Hibernate进行事务处理。那么,我如何以SYS的形式执行这个hibernate查询呢?
SELECT*FROM SYS.DUAL
的Post结果。这将确认是否已操纵了
sys.dual
。感谢Maheshwaran,实际上,我需要它来执行hibernate生成的查询,该查询在“插入”之前执行。下面是一个查询——“Hibernate:select BILLER\u ONBOARDING\u ID\u SEQ.nextval from dual”,我创建了另一个用户,该用户被传递给Hibernate进行事务处理。那么我如何以SYS的形式执行这个hibernate查询呢。?