La dualtabella "funziona" quasi esattamente come qualsiasi altra tabella: è una tabella da cui è possibile selezionare i record.
Questo significa, ad esempio, che puoi descrivere la tabella. Qui, in SQL*Plus:
SQL> set lines 50
SQL> desc dual
Name Null? Typ
----------------------- -------- ----------------
DUMMY VARCHAR2(1)
Quindi, la tabella ha una colonna, denominata dummyche è a varchar2(1).
La tabella ha, per progettazione, un record (almeno se nessuno ha giocherellato con esso):
SQL> select count(*) from dual;
COUNT(*)
----------
1
Quindi, al fine di ottenere lo stesso comportamento dual2che hai con dual, devi inserire un record in doppio. Meglio ancora, crearlo con un create table as select(ctas):
SQL> create table dual2 as select * from dual;
Ora la tua query funziona:
SQL> select 4*5 from dual2;
4*5
----------
20
In precedenza, ho detto che il doppio funziona quasi come qualsiasi altro tavolo. Quindi, quando non funziona come qualsiasi altro tavolo?
Si comporta diversamente, se non viene selezionato alcun valore dalla tabella stessa. Ancora una volta, con le tue domande, lascio che Oracle le spieghi ...
SQL> set lines 150
SQL> explain plan for select 4*5 from dual2;
EXPLAIN PLAN ausgef³hrt.
... per vedere come si accede alla tabella:
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 |
-------------------------------------------------------------------
Si può vedere che la dichiarazione fa un full table accesson dual2.
Ora, stessa cosa 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 |
-----------------------------------------------------------------
È qui che la dualtabella si comporta diversamente: il valore di dummynon è necessario, quindi fast dualviene eseguita un'operazione, affinché l'istanza non legga il valore effettivo sul disco.