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 :

Trigger et insertion.


Sujet :

Oracle

  1. #1
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut Trigger et insertion.
    Bonjour,

    Dans le cadre (encore) d'une migration mysql->oracle, je me retrouve avec des requetes qui ont cette tête là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     INSERT INTO f_component (champ1 , champ2) VALUES ('valeur1', 'valeur2');
    Ou est le problème me direz vous ? Eh bien il est dans le fait que la table contient un champs "id" en auto incrément. Sous MySQL, pas de soucis, le champs "id" se remplis. Par contre, sous oracle, il me sort :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-00001: unique constraint (DEV.SYS_C005645) violated
    Normal, l'id n'étant pas renseigné, ca part en vrille.

    Alors, malin, j'ai fait une ptite séquence, et un ptit trigger genre :

    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
     
    CREATE SEQUENCE seq_component_id; 
     
    CREATE TABLE f_component (
      id number(21) NOT NULL,
      champ1 varchar2(64) NOT NULL,
      champ2 varchar2(64) NOT NULL,
      PRIMARY KEY (id)
    );
     
    CREATE OR REPLACE TRIGGER trg_component_id
    BEFORE INSERT ON f_component FOR EACH ROW
    BEGIN
    	SELECT seq_component_id.nextval INTO :new.id from dual;
    END;
    /
    Mais ca ne marche pas non plus. Apparament, le trigger a l'air de remplacer l'id qu'on lui passe dans la requete, mais dans la mesure ou l'id n'est pas passé dans l'insert, le trigger ne se déclenche pas.

    Il y a une solution ? (à part recoder l'application ^^)

    Merci d'avance ^_^

  2. #2
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Et si au lieu de tenter de renseigner l'id dans le trigger, tu faisais l'insert dans le trigger plutôt ? En faisant gaffe que le trigger risque de s'auto-appeler évidemment.

  3. #3
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Faire l'insert dans le trigger ?

    Je comprend pas bien le principe... A un moment j'envoie une requete "insert" a Oracle, le trigger pourrait rajouter récuperer la valeur des divers champs et faire l'insert lui même ? Ou rajouter le champs id au passage, dans la requete insert ?

    Si c'est faisable, ca me va tout a fait comme méthode. Par contre... euh... comment on fait ca ?

  4. #4
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Quel est le statut de ton trigger ?

    S'il est valide, je ne vois pas de raison pour qu'il ne se déclenche pas, je pense plutôt que tu as déjà des valeurs dans ta table avec l'id défini par ta séquence.

    => re crée ta séquence avec comme valeur début la valeur maximale de l'id présente dans ta table.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 349
    Points : 409
    Points
    409
    Par défaut
    N'y a til pas de pb avec ta séquence ?
    Que donne sous SQLPLUS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select seq_component.curval from dual ;

    Ne faudrait-'il pas l'initialiser comme suit ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Create sequence seq_component
    INCREMENT BY 1
    START WITH 1;

    Cordialement
    TD

    CREATE SEQUENCE

    Create a sequence.

    Syntax:

    CREATE SEQUENCE [schema.]sequence_name option(s)

    Options:
    INCREMENT BY int
    START WITH int
    MAXVALUE int | NOMAXVALUE
    MINVALUE int | NOMINVALUE
    CYCLE | NOCYCLE
    CACHE int | NOCACHE
    ORDER | NOORDER

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 349
    Points : 409
    Points
    409
    Par défaut
    essaies :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE f_component (
      id number(21) default NULL,
      champ1 varchar2(64) NOT NULL,
      champ2 varchar2(64) NOT NULL,
      PRIMARY KEY (id)
    );
     
     create or replace trigger trg_component_id
    before insert on f_componentfor each row
    begin
        if :new.id is null then
            select seq_component.nextval into :new.id from dual;
        end if;
    end;

  7. #7
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Au fait chez moi ça marche très bien...

  8. #8
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    SQL> DROP TABLE TEST;
     
    Table supprimÚe.
     
    SQL>
    SQL> CREATE TABLE TEST
      2  (
      3  ID NUMBER NOT NULL,
      4  VALUE1 VARCHAR2(20),
      5  VALUE2 VARCHAR2(20),
      6  CONSTRAINT PK_TEST PRIMARY KEY(ID)
      7  );
     
    Table crÚÚe.
     
    SQL>
    SQL> DROP SEQUENCE seq_test_id;
     
    SÚquence supprimÚe.
     
    SQL>
    SQL> CREATE SEQUENCE seq_test_id;
     
    SÚquence crÚÚe.
     
    SQL>
    SQL> CREATE OR REPLACE TRIGGER test_id
      2  BEFORE INSERT ON TEST FOR EACH ROW
      3  BEGIN
      4     SELECT seq_test_id.NEXTVAL INTO :new.id FROM dual;
      5  END;
      6  /
     
    DÚclencheur crÚÚ.
     
    SQL>
    SQL> INSERT INTO TEST(VALUE1, VALUE2) VALUES('un','one');
     
    1 ligne crÚÚe.
     
    SQL> INSERT INTO TEST(VALUE1, VALUE2) VALUES('deux','two');
     
    1 ligne crÚÚe.
     
    SQL>
    SQL> SELECT * FROM TEST;
     
            ID VALUE1               VALUE2
    ---------- -------------------- --------------------
             1 un                   one
             2 deux                 two

  9. #9
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Rhaaa, mais pourquoi j'y ai pas pensé !

    Effectivement, la table contenait déjà quelques enregistrement, et du coup la sequence renvoyait une valeur déjà attribué !

    En fesant commecer la séquence a la valeur maximale de l'id présente dans ma table, ca passe nickel.



    Merci pour toutes vos réponses !

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

Discussions similaires

  1. Insert avec select sur table avec Trigger d'insertion
    Par bran_noz dans le forum Développement
    Réponses: 5
    Dernier message: 23/12/2005, 14h38
  2. pb trigger lors insertion enregistrment!
    Par tooneygirl dans le forum Oracle
    Réponses: 9
    Dernier message: 06/12/2005, 22h57
  3. Créer un trigger "before insert" avec SQL Server
    Par bubi dans le forum Développement
    Réponses: 2
    Dernier message: 14/11/2005, 10h12
  4. [trigger] update inserted?
    Par cosminutza dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/06/2005, 09h37
  5. Trigger et insert
    Par jf-nigou dans le forum Oracle
    Réponses: 5
    Dernier message: 16/02/2005, 16h45

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