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:
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