A dualtabela "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 dummyqual é 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 dual2que 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 accessativada 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 dualtabela se comporta de maneira diferente: o valor de dummynão é necessário; portanto, uma fast dualoperação é executada para que a instância não leia o valor real no disco.