La dual
tabella "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 dummy
che è 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 dual2
che 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 access
on 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 dual
tabella si comporta diversamente: il valore di dummy
non è necessario, quindi fast dual
viene eseguita un'operazione, affinché l'istanza non legga il valore effettivo sul disco.