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
Voici quelques tests que j'ai fais.
Je peux mettre à jour le champ DUMMY.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Partager