IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration Oracle Discussion :

Comportement bizarre de la table dual


Sujet :

Administration Oracle

  1. #1
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 992
    Points : 2 498
    Points
    2 498
    Par défaut 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


    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
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  2. #2
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Dans les premières versions d'Oracle, c'était une table normale. Mais elle est tellement utilisé que ca a été optimisé avec du code spécifique mais pour lequel la structure de la table ne peut pas changer.
    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  3. #3
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 992
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut Pacho,

    Merci pour la réponse mais quand tu dis que la structure de la table ne peux pas être changée, c'est faux car j'ai ajouté une colonne.
    Idem pour le type de la colonne DUMMY qu'on peut modifier.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Comme Pachot vous l'a indiqué cette table a été modifiée dans la version 10, il y a en fait une nouvelle "table" FAST DUAL derrière, voir dual optimisation in 10g.
    Je ne comprends pas très bien ce que vous voulez accomplir mais touchez à la table dual c'est tout simplement une très mauvais idée.

  5. #5
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 992
    Points : 2 498
    Points
    2 498
    Par défaut
    Hello mnitu,

    Merci pour le lien, c'était intéressant.
    Je ne voulais rien faire de spécial avec dual mais en voyant que je pouvais modifier la valeur de la colonne DUMMY, je me suis dit "qu'est-ce que je peux faire d'autre?" et c'est comme ça que je me suis lancé dans ces tests.

    Je suis quand même surpris de son comportement, surtout sur les SELECT et DELETE qui ne renvoient que le premier enregistrement; à croire qu'Oracle rajoute "where rownum = 1" à toutes les requêtes.
    En outre qu'on puisse ajouter une colonne à cette table me semble, en terme de sécurité, pas très sérieux, d'autant plus que je ne peux plus l'enlever; enfin bon, j'ai une sauvegarde
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  6. #6
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Lorsque el plan d'exécution montre 'FAST DUAL', ce n'est pas la table DUAL qui est lue. C'est court-circuité avec un resultset fixe.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

Discussions similaires

  1. [WD17] Fenêtre table fiche comportement bizarre
    Par mnssylvain dans le forum WinDev
    Réponses: 3
    Dernier message: 24/01/2015, 16h08
  2. xsl:test .... avec comportement bizarre
    Par Blue LC dans le forum XMLRAD
    Réponses: 2
    Dernier message: 10/06/2005, 14h56
  3. [ACESS][MEMO][ISNULL]Comportement bizarre
    Par seb.49 dans le forum ASP
    Réponses: 2
    Dernier message: 09/06/2004, 11h44
  4. [HttpClient] comportement bizarre, saute des catch()...
    Par iubito dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 04/02/2004, 16h25
  5. [Sybase] Comportement bizarre d'une table
    Par sdozias dans le forum Sybase
    Réponses: 4
    Dernier message: 03/02/2004, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo