A dual
tabela "funciona" quase da mesma maneira que qualquer outra tabela: é uma tabela da qual você pode selecionar registros.
Isso significa, por exemplo, que você pode descrever a tabela. Aqui, em SQL*Plus
:
SQL> set lines 50
SQL> desc dual
Name Null? Typ
----------------------- -------- ----------------
DUMMY VARCHAR2(1)
Portanto, a tabela possui uma coluna, denominada dummy
qual é a varchar2(1)
.
A tabela possui, por design, um registro (pelo menos se ninguém mexer com ela):
SQL> select count(*) from dual;
COUNT(*)
----------
1
Portanto, para obter o mesmo comportamento dual2
que você tem dual
, é necessário inserir um registro no dual. Melhor ainda, crie-o com um create table as select
(ctas):
SQL> create table dual2 as select * from dual;
Agora, sua consulta funciona:
SQL> select 4*5 from dual2;
4*5
----------
20
Anteriormente, eu disse que o dual quase funciona como qualquer outra tabela. Então, quando não funciona como qualquer outra tabela?
Ele se comporta de maneira diferente, se nenhum valor da tabela em si for selecionado. Novamente, com suas perguntas, deixo a Oracle explicá- las ...
SQL> set lines 150
SQL> explain plan for select 4*5 from dual2;
EXPLAIN PLAN ausgef³hrt.
... para ver como a tabela é acessada:
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------
Plan hash value: 3445655939
-------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| DUAL2 | 1 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------
Pode-se ver que a declaração está full table access
ativada dual2
.
Agora, a mesma coisa com dual
:
SQL> explain plan for select 4*5 from dual;
EXPLAIN PLAN ausgef³hrt.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------
Plan hash value: 1388734953
-----------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-----------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 |
| 1 | FAST DUAL | | 1 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------
É aqui que a dual
tabela se comporta de maneira diferente: o valor de dummy
não é necessário; portanto, uma fast dual
operação é executada para que a instância não leia o valor real no disco.