La dualtabla "funciona" casi como funciona cualquier otra tabla: es una tabla de la que puede seleccionar registros.
Esto significa, por ejemplo, que puede describir la tabla. Aquí, en SQL*Plus:
SQL> set lines 50
SQL> desc dual
Name Null? Typ
----------------------- -------- ----------------
DUMMY VARCHAR2(1)
Entonces, la tabla tiene una columna, llamada dummycual es a varchar2(1).
La tabla tiene, por diseño, un registro (al menos si nadie jugueteó con ella):
SQL> select count(*) from dual;
COUNT(*)
----------
1
Entonces, para obtener el mismo comportamiento con el dual2que tiene dual, debe insertar un registro en dual. Mejor aún, create table as selectcréelo con un (ctas):
SQL> create table dual2 as select * from dual;
Ahora, su consulta funciona:
SQL> select 4*5 from dual2;
4*5
----------
20
Anteriormente, dije que dual casi funciona como cualquier otra tabla. Entonces, ¿ cuándo no funciona como cualquier otra mesa?
Se comporta de manera diferente si no se selecciona ningún valor de la tabla en sí. Nuevamente, con sus consultas, dejo que Oracle las explique ...
SQL> set lines 150
SQL> explain plan for select 4*5 from dual2;
EXPLAIN PLAN ausgef³hrt.
... para ver cómo se accede a la tabla:
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 |
-------------------------------------------------------------------
Se puede ver que la declaración hace un full table accessencendido dual2.
Ahora, lo mismo con 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 |
-----------------------------------------------------------------
Aquí es donde la dualtabla se comporta de manera diferente: el valor de dummyno es necesario, por lo fast dualque se ejecuta una operación para que la instancia no lea el valor real en el disco.