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查询呢。?