Comportement bizarre de la table dual
Bonjour,
J'aimerai que quelqu'un m'explique comment Oracle gère la table DUAL car je trouve son comportement très bizarre.
Par exemple je peux ajouter une colonne mais pas la supprimer ensuite.
Je peux ajouter des enregistrements mais un select * ne renvoie que le premier enregistrement.
Si je fais un delete, idem, seul le premier enreg est supprimé...
Par avance merci pour vos lumières :D
Voici quelques tests que j'ai fais.
Je peux mettre à jour le champ DUMMY.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
SQL> desc dual;
Name Null? Type
----------------------------------------- -------- ----------------------------
DUMMY VARCHAR2(1)
SQL> select * from dual;
D
-
X
SQL> update dual set dummy = 'Z';
1 row updated.
SQL> select * from dual;
D
-
Z |
Je peux ajouter une colonne et mettre à jour celle-ci.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
SQL> alter table dual add TEST varchar2(1)
Table altered.
SQL> desc dual;
Name Null? Type
----------------------------------------- -------- ----------------------------
DUMMY VARCHAR2(1)
TEST VARCHAR2(1)
SQL> select * from dual;
D T
- -
Z
SQL> update dual set TEST = 'T';
1 row updated.
SQL> select * from dual;
D T
- -
Z T |
Je peux ajouter des enregistrements.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
SQL> insert into dual values ('2','2');
1 row created.
SQL> insert into dual values ('3','3');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from dual where TEST = 'T' or TEST = '2';
D T
- -
Z T
SQL> select * from dual where TEST = '2'
D T
- -
2 2 |
Ces enregistrements existent bien en base car ils ont un rowid différent et je peux y accéder avec une clause where.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
SQL> select rowid, dummy from dual where dummy = 'Z'
ROWID D
------------------ -
AAAAB0AABAAAAOhAAA Z
SQL> select rowid, dummy from dual where dummy = '2'
ROWID D
------------------ -
AAAAB0AABAAAAOhAAB 2
SQL> select rowid, dummy from dual where dummy = '3'
ROWID D
------------------ -
AAAAB0AABAAAAOhAAC 3
SQL> select * from dual where TEST = '3'
D T
- -
3 3 |
Pourtant Oracle me dit qu'il n'y a qu'un seul enregistrement.
Idem si je veux vider la table, je dois faire N delete.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
SQL> select count(*) from dual;
COUNT(*)
----------
1
SQL> delete from dual;
1 row deleted.
SQL> /
1 row deleted.
SQL> /
1 row deleted.
SQL> /
0 rows deleted. |
Impossible de supprimer ma colonne ajoutée.
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
SQL> desc dual;
Name Null? Type
----------------------------------------- -------- ----------------------------
DUMMY VARCHAR2(1)
TEST VARCHAR2(1)
SQL> alter table dual drop column TEST;
alter table dual drop column TEST
*
ERROR at line 1:
ORA-12988: cannot drop column from table owned by SYS |
Le truncate fonctionne bien en revanche.
Code:
1 2 3 4 5 6
|
SQL> truncate table dual;
Table truncated.
SQL> select * from dual;
no rows selected |
Je peux même modifier le type de la colonne DUMMY...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
SQL> alter table dual modify DUMMY varchar2 (2)
Table altered.
SQL> desc dual;
Name Null? Type
----------------------------------------- -------- ----------------------------
DUMMY VARCHAR2(2)
TEST VARCHAR2(1)
SQL> update dual set dummy = '11';
1 row updated.
SQL> select * from dual;
DU T
-- -
11 1 |