Bonjour,
voilà le contexte de mon problème :
J'ai une table T dans laquelle je stocke un nom et un code. Le code est une clef unique, calculée grâce à une fonction qui est appelée dans un trigger à l'insertion.
La méthode de calcul de ce code est la suivante : on prend les quatre premiers caractères alphabétiques du nom, auxquels on ajoute une séquence de 4 chiffres. Par exemple :va valoriser le champ code avec MAIS0001.
Code : Sélectionner tout - Visualiser dans une fenêtre à part insert into T (nom) values ('Maison');
Pour le calcul de la séquence numérique, on recherche la valeur max de SUBSTR(T.nom,5,4) et on y ajoute 1.
va valoriser le champ code avec MAIS0002.
Code : Sélectionner tout - Visualiser dans une fenêtre à part insert into T (nom) values ('Maisonnette');
En revanche, si j'exécute les deux instructions dans la même transaction (sans commit),
et bien la deuxième instruction sera rejetée au motif que la règle d'unicité du champ code a été violée. Dans ma transaction même sans faire de commit, j'ai bien la visibilité de la première instruction. Si j'insère un select entre les deux, je verrai que le premier enregistrement a bien été créé (même s'il n'a pas encore été commité) ce qui ne semble pas être le cas de la fonction, qui elle ne le voit pas encore. Du coup elle considère que l'enregistrement 'Chateau' n'existe pas et essaie de valoriser T.code à CHAT0001 pour les deux lignes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 insert into T (nom) values ('Chateau'); insert into T (nom) values ('Chaton');
Mon besoin est d'insérer un très grand nombre d'enregistrements (potentiellement quelques centaines de milliers) et je me vois mal fixer ma fréquence de commit à 1.
Est-ce que vous savez comment je pourrais faire pour que ma fonction puisse "voir" que le premier enregistrement a déjà été créé, et ainsi le prendre en compte pour le calcul du T.code de l'enregistrement suivant ?
Merci pour toutes vos suggestions !
Partager