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

Forms Oracle Discussion :

Numéro séquentiel !


Sujet :

Forms Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2007
    Messages
    390
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 390
    Par défaut Numéro séquentiel !
    Bonjour,

    J'ai une table où une colonne doit contenir des valeurs séquentielles automatiquement en utilisant l'instruction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select nvl(max(to_number(NUMERO_S)),0)+1 into :NUMERO_S
    from table;
    c'est la clé primaire.

    Je veux alimenter cette clé par une séquence mais le problème c'est que suite à une suppression ces numéros ne sont pas séquentiels.

    Comment je peux assurer le séquencement des numéros.

    Merci pour les propositions.

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Pas sur de bien comprendre !

    L'instruction que tu montres est une séquence artisanale contrairement à une séquence gérée par Oracle.

    Je veux alimenter cette clé par une séquence mais le problème c'est que suite à une suppression ces numéros ne sont pas séquentiels.
    Comment je peux assurer le séquencement des numéros.
    Si tu utilises une séquence tu auras un n° unique généré à chaque appel, mais suite à des suppressions tu auras des "trous".

    Est-ce bien cela que tu entends par "suite à une suppression ces numéros ne sont pas séquentiels" ?

    Tu veux combler les "trous" de la séquence ?

  3. #3
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2002
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 72
    Par défaut
    le + simple serai de faire un trigger sur la table qui aille rechercher les trous et qui les remplisse.
    et après tu remplace le :new.NUMERO_S par le nombre que tu a trouvé.
    mais bon c'est pas tip top comme traitement, a chaque insertion tu va devoir rechercher.
    tu ne peux pas remplacer cette clé primaire par une autre dans ta table ?

  4. #4
    Membre éclairé
    Inscrit en
    Novembre 2007
    Messages
    390
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 390
    Par défaut
    Merci pour les réponses.

    Tu veux combler les "trous" de la séquence ?
    Exactement, tenant l'exemple d'un bon de livraison ou autre qui doit avoir des numéros successives.

    tu ne peux pas remplacer cette clé primaire par une autre dans ta table ?
    Je peux remplacer cette clé par une autre mais le problème c'est que cette clé soit toujours contenant des numéros séquentielles même après suppression des données.

  5. #5
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2002
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 72
    Par défaut
    alors le trigger est ton meilleur ami !

    a l'interieur de celui ci tu parcourt tes numero jusqu'a un trou et tu le met dans :new.NUMERO_S

    et tu le fait sur le "on insert".

  6. #6
    Membre éclairé
    Inscrit en
    Novembre 2007
    Messages
    390
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 390
    Par défaut
    Je pense que cela a des effets sur la performance en parcourant des milliers d'enregistrements !!!!

  7. #7
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Citation Envoyé par bguihal Voir le message
    alors le trigger est ton meilleur ami !
    a l'interieur de celui ci tu parcourt tes numero jusqu'a un trou et tu le met dans :new.NUMERO_S
    et tu le fait sur le "on insert".
    Citation Envoyé par tunis71187 Voir le message
    Je pense que cela a des effets sur la performance en parcourant des milliers d'enregistrements !!!!
    Surtout qu'il faudra vérouiller toute la table sinon quelqu'un peut refaire des trous dans ce que tu as déjà lu !
    Citation Envoyé par tunis71187 Voir le message
    vraiment je n'ai pas pensé que c'est assez compliqué car actuellement, sur l'application je cherche le max du clé et en pre-insert j'alimente le champ.
    Là aussi, il faut vérouiller la table pour qu'il n'y ait pas 2 inserts en même temps.

    Citation Envoyé par tunis71187 Voir le message
    Exactement, tenant l'exemple d'un bon de livraison ou autre qui doit avoir des numéros successives.
    Est-ce qu'en cas de suppression il faut (1) tout renuméroter (je suppose que non) ou (2) simplement réutiliser le numéro plus tard ?
    Et s'il faut le réutiliser plus tard, est-ce qu'on peut (2a) se permettre d'attendre et qu'il y ait un trou pendant un certain temps, ou faut-il (2b) le réutiliser tout de suite au prochain insert ?

    Le (1) peut se résoudre en calculant le numéro au moment du select et non de l'insert.
    Le (2a) peut s'implémenter en faisant une file d'attente de numéros à réutiliser.
    Le (2b) serait beaucoup plus complexe. Un delete devrait s'assurer qu'il n'y a aucun insert en cours, puis faire le delete mais ne commiter que lorsque une autre transaction aura réutilisé le numéro.

    Mais un bon de livraison, c'est simple. Il ne devrait jamais être supprimé. Du moins une fois qu'il a été imprimé ou envoyé à un système externe.

    Si on a besoin d'en supprimer un qui vient d'être saisi, alors il faudrait avoir une numérotation en batch asynchrone: on saisit des bons de livraison 'brouillon' sans numéro et un batch périodique fait passer tous les brouillons à l'état valide en les numérotant.

    Cordialement,
    Franck.

  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
    Pour s'enfuir du problème d'accès concurrent je veux juste une méthode qui me permet d'assurer le séquencement.
    On ne peut pas s’enfuir du problème d’accès concurrent que si vous est le seul utilisateur de la base. Une table de compteur réponde à votre demande mais peut constituer un point d’étranglement dans votre application si des milliers des utilisateurs saisis simultanément des bons de commande.

    @pachot
    ...
    Un delete devrait s'assurer qu'il n'y a aucun insert en cours, puis faire le delete mais ne commiter que lorsque une autre transaction aura réutilisé le numéro.
    ...
    Je m’imagine l’application vendredi soir après que le dernière utilisateur viens de supprimer le bons de commande et ferme la lumière derrière lui.

Discussions similaires

  1. [AC-2002] Reprendre à zéro les numéros séquentiels des enregistrements
    Par azertix dans le forum Modélisation
    Réponses: 4
    Dernier message: 26/01/2010, 10h55
  2. Comment faire un numéro séquentiel dans une table
    Par z_ahlam dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/10/2009, 10h09
  3. Réponses: 2
    Dernier message: 03/03/2008, 03h31
  4. Besoin de renseignement sur un numéro séquentiel
    Par loic20h28 dans le forum Schéma
    Réponses: 4
    Dernier message: 17/01/2008, 15h04
  5. Clé primaire avec numéro séquentiel préfixé...
    Par Michelk12 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/03/2006, 15h44

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