2015-05-20 3 views
2

Я получил этот запрос:Oracle DUAL таблица возвращает "ни одна строка не выбрана"

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 

Почему это происходит?

+0

Добро пожаловать! Пожалуйста, посмотрите [тур] (http://stackoverflow.com/tour) и [как спросить] (http://stackoverflow.com/help/how-to-ask). – moffeltje

+1

Выбор из 'dual' должен всегда возвращать строку,' select * from dual' работать как ожидалось?!? –

+0

Да, выберите * from dual, также возвращая '' никакие строки не выбрали. –

ответ

2

выбрать BILLER_ONBOARDING_ID_SEQ.NEXTVAL из двойного;

Возможно, что двойной стол пуст. С SYSDB привилегия, вы можете удалить/усекатьSYS.DUAL стол.

Однако вы все равно получите значение sequence.nextval, даже если dual не возвращает строку. Оптимизатор как-то уверен, что всегда извлекает строку из двух таблиц.

SQL> conn [email protected] 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 

объяснить план показывает, что БЫСТРО 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 - специальная таблица, которая является собственностью d на 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; 
+0

Помню, вставка второй строки. По крайней мере, это называется DUAL :-) – dnoeth

+0

Lalit, Спасибо за подробное объяснение. На самом деле, мне нужно это для спящего сгенерированного запроса, который выполняется до «insert into». Ниже приведен запрос - «Hibernate: select BILLER_ONBOARDING_ID_SEQ.nextval from dual ", я создал другого пользователя, который передается в hibernate для выполнения транзакции, поэтому как бы выполнить этот запрос на спящий режим как SYS? –

+0

Опубликовать результат' SELECT * FROM SYS.DUAL'. Это подтвердит управляется ли 'sys.dual'. –

2

Попробуйте это,

select BILLER_ONBOARDING_ID_SEQ.NEXTVAL from SYS.dual; 

У вас есть таблица DUALпользовательских в вашей базы данных. И, следовательно, частный синоним может указывать вашу версию таблицы, а не SYS.DUAL.

Итак, запрос DUAL с названием схемы SYS, решит tht.

SELECT OWNER,TABLE_NAME FROM ALL_TABLES WHERE TABLE_NAME = 'DUAL'; 

Этот запрос список будет таблица, в которой не проживание в SYS схеме.

EDIT:

Из комментариев, мы можем сделать вывод, что вы ищете

Cannot retrieve the id of the last inserted row in Hibernate using Oracle


На стороне записки, PL/SQL решение для того же может быть как ИСПОЛЬЗОВАНИИ RETURNING пункт с INSERT.

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> 
+0

Спасибо Maheshwaran, На самом деле, мне это нужно для спящего сгенерированного запроса, который выполняется до« ins » ert into ". Ниже приведен запрос - «Спящий режим: выберите BILLER_ONBOARDING_ID_SEQ.nextval from dual», я создал другого пользователя, который передается в спящий режим для выполнения транзакции. так как я могу выполнить этот запрос спящего режима как SYS.? –