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

Oracle Discussion :

Function-based index : ORA-00001


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Par défaut Function-based index : ORA-00001
    Bonjour à tous,

    Je rencontre un problème de contrainte d'unicité violée avec un index fonction.

    Voici le contexte :
    J'ai une table case possédant une primary key (nommé objid), une clé étrangère case2condition et un index fonction x_case_cond. J'ai également une table_condition qui est pointée par la clé étrangère case2condition. La table_condition permet de connaître l'état d'un case.


    Voici le code de la fonction de l'index (le p_objid en paramètre est l'id de la table_condition) :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    FUNCTION  x_case_cond_fct (p_objid NUMBER)
       RETURN NUMBER DETERMINISTIC
    AS
       l_cond      sa.TABLE_CONDITION.condition%TYPE;
       type_cond   NUMBER;
    BEGIN
     
       BEGIN
          SELECT condition
            INTO l_cond
            FROM TABLE_CONDITION
           WHERE objid = p_objid;
       EXCEPTION
          WHEN NO_DATA_FOUND
          THEN
             RETURN (NULL);
       END;
     
       IF (l_cond = 2 OR l_cond = 16386 OR l_cond = 16384)
       THEN
          type_cond := 1;
       ELSIF (l_cond = 8 OR l_cond = 10 OR l_cond = 32 OR l_cond = 34)
       THEN
          type_cond := 2;
       ELSE
          type_cond := NULL;
       END IF;
     
       RETURN (type_cond);
    END x_case_cond_fct;

    La table condition permet de connaître l'état d'un case. Suivant cet état on indexe ou non.

    La manipulation que j'effectue est la suivante :

    Un patch supprime des enregistrements de la table_case. Un autre patch permet le retour arrière et donc de restaurer les enregistrements supprimés (sauvegardé dans une table tempo).

    Or, j'obtiens une erreur ORA-00001 unique constraint (SA.X_CASE_COND) violated lors de la restauration. J'en déduis donc que l'index fonction n'est pas mis à jour lors de l'enregistrement de la table_case.

    La seule solution que j'ai trouvé et de reconstruire l'index (alter index x_case_cond rebuild. Mais j'ai peur que cette manip soit trop longue (table_case contient 20 millions de lignes).

    Merci d'avance pour votre aide.

    Aurélien

  2. #2
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut

    Là il doit y avoir un malentendu quelque part car ta fonction ne renvoi que 2 valeurs possible (+ NULL) donc je vois mal comment tu peux avoir un index unique sur cette fonction....

    D'autres part (une fois le malentendu dissipé par + de précision de ta part), regarde la procédure de restauration des données, peut etre qu'elle passe par une phase ou des lignes sont en double pour purger ensuite. En tout cas il faut regarder précisément ce qui se passe là aussi en montrant ce que fait exactement cette restauration.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Par défaut
    Salut remi4444,

    l'index n'est pas unique, d'où mon étonnement sur la restauration... J'ai vérifié, il n'y a pas d'insertion de doublon.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Par défaut
    J'ai oublié de précisé que je travaillais sous Oracle 9i

  5. #5
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Pourtant le message indique clairement une contrainte d'unicité... étrange.

    que donne la requête suivante ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from ALL_CONSTRAINTS
    where OWNER = 'SA'
    and CONSTRAINT_NAME = 'X_CASE_COND';
    ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Par défaut
    Malheureusement, ça ne donne rien...

Discussions similaires

  1. [10g] 10G : imp oracle sur les function-based indexes
    Par abcrabcr dans le forum Import/Export
    Réponses: 0
    Dernier message: 09/09/2014, 19h25
  2. function based index - bogue
    Par tommey dans le forum SQL
    Réponses: 3
    Dernier message: 12/10/2012, 18h06
  3. Erreur ORA-00001 lors d'un enregistrement
    Par gscorpio dans le forum Oracle
    Réponses: 4
    Dernier message: 11/12/2006, 13h09
  4. Réponses: 4
    Dernier message: 06/10/2006, 15h36
  5. [imp] ORA-00001 lors d'import de séquences
    Par exempleinfo dans le forum Oracle
    Réponses: 1
    Dernier message: 17/02/2006, 11h41

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