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

SQL Oracle Discussion :

ORA-02257: maximum number of columns exceeded


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Par défaut ORA-02257: maximum number of columns exceeded
    Bonjour,

    J'avais une table ayant 50 colonnes et dont la clé primaire contenait 32 colonnes. J'ai ajouté 3 champs à cette table, la passant à 53 colonnes. Jusqu'ici tout va bien. J'ai voulu ajouter un de ces champs à la clé primaire et là :
    ORA-02257: maximum number of columns exceeded

    Je me doute que le nombre de champs de la clé est trop important mais j'ai pas trouvé de doc indiquant clairement que le nombre de champ d'une clé primaire Oracle ne doit pas dépasser 32 champs. Quelqu'un peut-il me le confirmer?? Et y a-t-il un moyen de contourner ce problème.

    Merci,
    Bonne journée

  2. #2
    Membre émérite Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Par défaut
    Bonjour,
    Est-ce qu'il est vraiment nécessaire d'avoir une clé primaire composée de 30 colonnes ? Je ne pense pas.

    Pourquoi ne pas créer une colonne de type entier qui s'auto-incrémente (à l'aide d'une séquence) ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Par défaut
    Déjà c'est un schéma en étoile où les champs qui composent la clé correspondent au dimensions et que c'est un projet qui a évolué dans le temps et qu'on pensait pas forcément arriver à ce nombre de champ(et qu'on ne savait pas qu'on était limite).
    On doit aussi vérifier l'unicité des données sur tous ces champs.

    De toute façon, si c'est pas possible, faudra trouver une solution, et c'est vrai que la séquence peut en être une...

  4. #4
    Membre émérite Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Par défaut
    La limite du nombre de colonnes concernant les indexs se trouve dans la doc:
    http://download.oracle.com/docs/cd/E...2.htm#i2062718

    column
    Specify the name of one or more columns in the table. A bitmap index can have a maximum of 30 columns. Other indexes can have as many as 32 columns.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Par défaut
    Ok merci, la c'est clair
    Ca fait chier quand meme...

  6. #6
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Hello,

    Juste pour répondre sur le fond, avoir une telle clé primaire est une grave erreur de conception, Oracle n'a pas mis une contrainte à 32 champs juste pour "faire chier"

    Je vous invite à jeter un oeil à cet article : Clefs auto incrémentées, le début de l'article explique comment on doit définir une clé.

    Bon courage,
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  7. #7
    Membre expérimenté Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Par défaut
    Moi aussi je vois une clé primaire composée de 30 colonnes c'est très grave.

    tu peux vérifier l'unicité des champs que tu veux dans Forms par du PL/SQL

  8. #8
    Expert confirmé 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
    Par défaut
    Citation Envoyé par mongilotti Voir le message
    tu peux vérifier l'unicité des champs que tu veux dans Forms par du PL/SQL

  9. #9
    Membre expérimenté Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Par défaut
    c'est simple à faire, dans les déclencheurs PRE-UPDATE ET PREINSERT du bloc,
    tu ouvre un curseur sur la table avec les conditions d'unicité que tu veux, si tu trouve des données alors tu bloque la transaction.

    c'est tout, aussi avec un trigger before insert or update sur la table elle même,
    donc tu as beaucoup de choix, à toi de choisir...

  10. #10
    Expert confirmé 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
    Par défaut
    Citation Envoyé par mongilotti Voir le message
    c'est simple à faire, dans les déclencheurs PRE-UPDATE ET PREINSERT du bloc,
    tu ouvre un curseur sur la table avec les conditions d'unicité que tu veux, si tu trouve des données alors tu bloque la transaction.

    c'est tout, aussi avec un trigger before insert or update sur la table elle même,
    donc tu as beaucoup de choix, à toi de choisir...
    Hic Rhodus, hic salta.

  11. #11
    Membre expérimenté Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Hic Rhodus, hic salta.

    c'est du chinois ça?

  12. #12
    Expert confirmé 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
    Par défaut
    Citation Envoyé par mongilotti Voir le message
    c'est du chinois ça?
    Non c’est du latin.
    En traduction libre cela signifie : parce que c'est simple exemplifiez-le: table, triggers, jeux d’essaie, etc.

  13. #13
    Membre expérimenté Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Non c’est du latin.
    En traduction libre cela signifie : parce que c'est simple exemplifiez-le: table, triggers, jeux d’essaie, etc.
    Ok, pour vérifier l'unicité d'un enregistrement dans forms, on fait comme ça:

    on supposte qu'on a la table T(Ch1, Ch2, Ch3) et on a une forme basée sur cette table.

    dans les déclencheurs PRE-UPDATE ET PRE-INSERT du bloc, on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      DECLARE
        CURSOR CUR IS
          SELECT * 
          FROM    T1
          WHERE   CH1 = :Ch1
          AND       CH2 = :Ch2
          AND       CH3 = :Ch3;
      BEGIN
         OPEN CUR;
         IF CUR%FOUND THEN
            AFICHER_UN_MESSAGE_UNICITE
         END IF;
      END;

  14. #14
    Expert confirmé 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
    Par défaut
    Citation Envoyé par mongilotti Voir le message
    Ok, pour vérifier l'unicité d'un enregistrement dans forms, on fait comme ça:

    on supposte qu'on a la table T(Ch1, Ch2, Ch3) et on a une forme basée sur cette table.

    dans les déclencheurs PRE-UPDATE ET PRE-INSERT du bloc, on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      DECLARE
        CURSOR CUR IS
          SELECT * 
          FROM    T1
          WHERE   CH1 = :Ch1
          AND       CH2 = :Ch2
          AND       CH3 = :Ch3;
      BEGIN
         OPEN CUR;
         IF CUR%FOUND THEN
            AFICHER_UN_MESSAGE_UNICITE
         END IF;
      END;
    Cela ne marche que si vous est le seul utilisateur de la base ce qui en général n'est pas le cas. Et, le gens utilisent aujourd'hui autre chose que Forms pour développer des applications avec Oracle.

  15. #15
    Membre expérimenté Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Par défaut
    Oui on peut ajouter for update pour verrouiller la table en mode saisie,
    mais je suis d'accord que les gens utilise d'autre outils pour développer avec oracle. ça reste une solution parmi d'autre.

  16. #16
    Expert confirmé 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
    Par défaut
    Citation Envoyé par mongilotti Voir le message
    Oui on peut ajouter for update pour verrouiller la table en mode saisie,
    mais je suis d'accord que les gens utilise d'autre outils pour développer avec oracle. ça reste une solution parmi d'autre.
    Non, ce n'est pas une solution. Et je suis curieux comment le For Update vous permet de resoudre ce problème ... Comme d'habitude un exemple sera bienvenu.

  17. #17
    Expert confirmé 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
    Par défaut
    Pas d'exemple
    Pas de trigger sur la table
    Pas de solution
    Pas de exemple avec 'FOR UPDATE'

    c'est simple à faire,...
    Ca n'a pas l'air

  18. #18
    Membre expérimenté Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Par défaut
    je reprend l'exemple que j'ai déja mis,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     DECLARE
        CURSOR CUR IS
          SELECT * 
          FROM    T1
          WHERE   CH1 = :Ch1
          AND       CH2 = :Ch2
          AND       CH3 = :Ch3;
      BEGIN
         OPEN CUR;
         IF CUR%FOUND THEN
            AFICHER_UN_MESSAGE_UNICITE
         END IF;
      END;
    c'est vrai que en concurrentiel, 2 utilisateurs peuvent saisir les mêmes valeurs, mais le 1er qui enregistre bloque le deuxième.

    donc il y' aura pas de problèmes.

    cette solution est fiable.

  19. #19
    Expert confirmé 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
    Par défaut
    ...c'est vrai que en concurrentiel, 2 utilisateurs peuvent saisir les mêmes valeurs, mais le 1er qui enregistre bloque le deuxième.
    ...
    Comme je vous l'ai déjà dit cet exemple ne marche pas; il n'empêche pas la saisie des doublons pour être plus précis.

  20. #20
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Comme je vous l'ai déjà dit cet exemple ne marche pas; il n'empêche pas la saisie des doublons pour être plus précis.
    Bonjour,
    Pourriez vous etailler d'un exemple votre remarque s'il vous plait? Je ne suis pas sur de comprendre ou vous voulez en venir.

Discussions similaires

  1. [11g] ORA-00020: maximum number of processes (%s) exceeded
    Par mariachi dans le forum Administration
    Réponses: 2
    Dernier message: 28/04/2014, 14h11
  2. Réponses: 4
    Dernier message: 14/01/2013, 12h37
  3. ORA-00018: maximum number of sessions exceeded
    Par fanah dans le forum Administration
    Réponses: 11
    Dernier message: 20/01/2011, 08h59
  4. ORA-02257: maximum number of columns exceeded
    Par khomar dans le forum SQL
    Réponses: 0
    Dernier message: 12/03/2010, 15h02
  5. [PRO*C][LINUX]ORA-1000:Maximum cursors exceeded
    Par Madeiras dans le forum Interfaces de programmation
    Réponses: 4
    Dernier message: 30/10/2005, 10h16

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