La dual
table "fonctionne" presque comme n'importe quelle autre table: c'est une table dans laquelle vous pouvez sélectionner des enregistrements.
Cela signifie, par exemple, que vous pouvez décrire le tableau. Ici, dansSQL*Plus
:
SQL> set lines 50
SQL> desc dual
Name Null? Typ
----------------------- -------- ----------------
DUMMY VARCHAR2(1)
Ainsi, la table a une colonne, nommée dummy
qui est un varchar2(1)
.
La table a, par conception, un enregistrement (du moins si personne ne l'a manipulé):
SQL> select count(*) from dual;
COUNT(*)
----------
1
Donc, pour obtenir le même comportement que celui dual2
que vous avez avec dual
, vous devez insérer un enregistrement dans le double. Mieux encore, créez-le avec uncreate table as select
(ctas):
SQL> create table dual2 as select * from dual;
Maintenant, votre requête fonctionne:
SQL> select 4*5 from dual2;
4*5
----------
20
Un peu plus tôt, je l' ai dit que la double presque fonctionne comme n'importe quelle autre table. Alors, quand ça ne marche pas comme n'importe quelle autre table?
Il se comporte différemment si aucune valeur de la table elle-même n'est sélectionnée. Encore une fois, avec vos questions, je laisse Oracle expliquer ...
SQL> set lines 150
SQL> explain plan for select 4*5 from dual2;
EXPLAIN PLAN ausgef³hrt.
... afin de voir comment accéder à la table:
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 |
-------------------------------------------------------------------
On peut voir que la déclaration fait un full table access
on dual2
.
Maintenant, même chose avec 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 |
-----------------------------------------------------------------
C'est là que la dual
table se comporte différemment: la valeur de dummy
n'est pas nécessaire, donc une fast dual
opération est exécutée, afin que l'instance ne lise pas la valeur réelle sur le disque.