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

Administration Oracle Discussion :

1er déclenchement d'un trigger d'auto-incrément


Sujet :

Administration Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut [RESOLU]1er déclenchement d'un trigger d'auto-incrément
    Bonjour

    Je voudrais insérer automatiquement une valeur auto-incrémentée dans une table grace a un trigger. Au 1er déclenchement du trigger, ma table est vide, je veux donc qu'il fasse :
    si rang is null alors rang =0 puis rang=rang+1.
    (NB:rang ne peut etre null)

    Voilà mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE OR REPLACE TRIGGER INCR_RANG
    BEFORE INSERT ON NOM_TABLE
    FOR EACH ROW 
    BEGIN
    	IF :new.rang is null 
    	THEN :new.rang:=0; 
    	END IF; 
    	SELECT MAX(rang)+1
    	INTO :NEW.rang 
    	FROM NOM_TABLE; 
    END;
    L'erreur générée est
    ORA-01400: impossible d'insérer NULL dans ("NOM_TABLE"."RANG")

    Qqun peut-il m'aider ?
    Merci

  2. #2
    Membre à l'essai
    Inscrit en
    Août 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    1 - tu ne peux pas utilisé une sequence plutot?

    2 - essaye ce code ça devrais passer :

    CREATE OR REPLACE TRIGGER INCR_RANG
    BEFORE INSERT ON NOM_TABLE
    FOR EACH ROW
    BEGIN
    SELECT MAX(nvl(rang,0))+1
    INTO :NEW.rang
    FROM NOM_TABLE;
    END;

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Ca marche mais que à la 2e insertion.
    J'ai desactivé le not null de rang, donc il met "null" à la 1ere insertion et commence l'incrémentration à la 2e ...

    Parce qu'en fait le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT nvl(rang,0) FROM NOM_TABLE
    renvoie {null} quand la table est vide



    Merci

  4. #4
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Chand_bing vous parle de MAX(Nvl...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(nvl(rang,0))+1
    avez-vous bien utilisé ceci ?
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    oui il faut absolument le MAX devant sinon marchera pas

    bon courage

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par chand_bing
    oui il faut absolument le MAX devant sinon marchera pas

    bon courage

    oui, j'ai bien utilisé MAX mais
    SELECT MAX(nvl(rang,0))+1 FROM NOM_TABLE renvoie null car la table est vide ....

  7. #7
    Membre à l'essai
    Inscrit en
    Août 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    exact je me suis trompé sorry

    essaye cela

    SELECT NVL(MAX(rang)+1,0) FROM NOM_TABLE

  8. #8
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Effectivement, il faut faire le contraire...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select NVL( MAX( colonne ) , 0 ) + 1 From ...
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2002
    Messages : 177
    Points : 81
    Points
    81
    Par défaut
    je ne comprends pas exactement ce que tu veux.

    Tu veux que à chaque fois que tu insères un enregistrement, un trigger mette automatiquement une valeur incrémenté dans ton champ ou est-ce que tu veux qu'une valeur de l'un de tes champs soit à 0???

    Si tu pouvais expliquer la raison du pourquoi tu veux faire cela, ce serait sympa

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Merci SheikYerbouti ! Ca marche nickel !

    Bindy, en fait, je voulais que le rang s'incrémente à chaque insertion d'une nouvelle ligne sachant qu'à la 1ere insertion ma table est vide.

    SheikYerbouti, est-ce que je peux abuser de ton savoir et te demander encore un peu d'aide ?
    En fait ce rang est un rang d'etape à l'interieur d'un process.
    Je veux que que ce rang s'incrémente à l'intérieur d'un process donné.

    Par exemple :
    - Process 1 : 1ere insertion -> rang=1
    - Process 1: 2eme insertion -> rang=2
    - Process 2 : 1ere insertion -> rang=1 (alors que là, rang=3)

    Est-ce que je mets cette condition dans un where ?

    Merci à tous

  11. #11
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Oui car dans ce cas, il faut faire un MAX du process en question.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut [RESOLU]
    Nicekl, ça marche tip-top mais je fais pas de max ...
    Voilà mon trigger

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE OR REPLACE TRIGGER HISTO 
    BEFORE INSERT ON HISTORIQUE  
    FOR EACH ROW 
    BEGIN 
    	SELECT NVL(MAX(rang),0)+ 1 
    	INTO :NEW.rang 
    	FROM HISTORIQUE WHERE id_process:NEW.id_process; 
    END;
    Is it ok ?

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trigger d'auto-incrémentation
    Par InchRay dans le forum PL/SQL
    Réponses: 1
    Dernier message: 07/02/2014, 09h01
  2. trigger auto incrément après insertion
    Par abdelghani_k dans le forum Développement
    Réponses: 3
    Dernier message: 03/05/2011, 09h32
  3. Réponses: 11
    Dernier message: 19/07/2010, 23h48
  4. [CODE] auto incrémentation ?
    Par Roi dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 25/09/2003, 15h09
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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