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] - retourné plusieurs valeurs ?


Sujet :

Oracle

  1. #1
    Membre régulier Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Points : 119
    Points
    119
    Par défaut [Trigger] - retourné plusieurs valeurs ?
    (re)-Bonjour,

    j'ai un problème de compréhension du comportement des triggers.

    jusque la je me servais d'un trigger pour autoincrement un champs.

    mais pour les besoins d'une application il faudrait remplir 2 champs.

    voila le problème simplifié

    INFO :: version Oracle 8.1.7.4

    Soit une table avec une col. ID et REFID

    j'ai une sequence SEQ_ID. le but de de créer un trigger qui fasse


    Dans mon idée ce trigger devrai être valide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE OR REPLACE TRIGGER TRIG_ID
    BEFORE INSERT ON IDLIST
    FOR EACH ROW 
    BEGIN 
    	SELECT SEQ_ID.NEXTVAL,SEQ_ID.NEXTVAL INTO :NEW.ID,:NEW.REFID FROM DUAL; 
    END;
    /
     
    Trigger created.
    mais lors de l'insert j'ai l'erreur suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ORA-01422: exact fetch returns more than requested number of rows
    ORA-06512: at "OPS$XXXXXX.TRIG_ID", line 2
    ORA-04088: error during execution of trigger 'OPS$XXXXXX.TRIG_ID'

    quelqu'un a t une explication ??

    merci d'avance

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 120
    Points : 69
    Points
    69
    Par défaut
    Essaye cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE OR REPLACE TRIGGER TRIG_ID
    BEFORE INSERT ON IDLIST
    FOR EACH ROW
    LINT_SEQ INT;
    BEGIN
       SELECT SEQ_ID.NEXTVAL INTO LINT_SEQ FROM DUAL;
      :NEW.ID:=LINT_SEQ;
      :NEW.REFID:=LINT_SEQ;
    END;
    /

  3. #3
    Membre régulier Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Points : 119
    Points
    119
    Par défaut
    j'ai essayer mais j'ai la même erreur (j'ai rajouté le 'DECLARE' t'as du l'oublier)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE OR REPLACE TRIGGER TRIG_ID
    BEFORE INSERT ON IDLIST
    FOR EACH ROW
    DECLARE
    LINT_SEQ INT;
    BEGIN
       SELECT SEQ_ID.NEXTVAL INTO LINT_SEQ FROM DUAL;
      :NEW.ID:=LINT_SEQ;
      :NEW.REFID:=LINT_SEQ;
    END;
    /
    à l'insert j'ai

    ORA-01422: exact fetch returns more than requested number of rows


  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 120
    Points : 69
    Points
    69
    Par défaut
    Quel est l'ordre de création de ta séquence ?
    Cela pourra surement m'aider ...

  5. #5
    Membre régulier Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Points : 119
    Points
    119
    Par défaut
    voila le code de creation de sequence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE SEQUENCE SEQ_ID 		START WITH 1 INCREMENT BY 1 MAXVALUE 99999 NOCACHE NOCYCLE ;

  6. #6
    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
    N'auriez-vous pas un problème avec la table DUAL ? (plusieurs lignes...)

  7. #7
    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
    Que donne cette requête sous SQL*Plus ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SEQ_ID.NEXTVAL INTO LINT_SEQ FROM DUAL;
    Vous ne faites rien d'autre dans le trigger que le code que vous nous avez indiqué ?

  8. #8
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par plaineR
    Que donne cette requête sous SQL*Plus ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SEQ_ID.NEXTVAL INTO LINT_SEQ FROM DUAL;
    Sans le INTO LINT_SEQ, sans doute.

  9. #9
    Membre régulier Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Points : 119
    Points
    119
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL> r
      1* select * from dual
     
    D
    -
    X
     
    SQL>
    Dual me parrait aussi vide que d'habitude ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select SEQ_ID.NEXTVAL from dual ;
    13
    rien de plus dans le trigger

  10. #10
    Membre régulier Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Points : 119
    Points
    119
    Par défaut
    un truc bizard ce passe ???


    tous les autres triggers ON INSERT de la base renvoie la même erreur !!!

    moi plus comprendre....

    d'ou cela peut il venir ??

  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
    Il y a un problème avec la table dual.

    faites ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELETE FROM dual
    /
    INSERT INTO dual VALUES ('X')
    /

  12. #12
    Membre régulier Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Points : 119
    Points
    119
    Par défaut
    Bonne réponse !!

    mais pkoi ??? je croyais que DUAL estait indestructible du fait de sa virtualité ??

  13. #13
    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
    Il y tellement de choses que l'on croit......

  14. #14
    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
    Sheik, peux-tu m'expliquer quelque chose : pourquoi l'erreur se déclenchait dans le trigger alors que quand jacquesh exécutait sa requête sous SQL*Plus, il n'avait pas de problème (une seule ligne s'affichait) ?

  15. #15
    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
    Une requête sous Sql*Plus ne génèrera jamais d'erreur de type de celles pouvant être rencontrées dans un Select ... Into (du genre TOO_MANY_ROWS, etc)

  16. #16
    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
    Oui, c'est sûr, mais si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select maseq.nextval from matable;
    j'aurais autant de lignes qu'il y en a dans ma table, alors que là sous SQL*Plus il n'y avait qu'une ligne ?

    Ma question (posée plus clairement) est donc : pourquoi s'il y avait plusieurs lignes dans la table dual, à l'affichage sous SQL*Plus cela ne se voyait pas ?

  17. #17
    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
    Je ne sais trop, les voix de DUAL sont impénétrables...
    Toujours est-il que ce type d'erreur avec DUAL est toujours synonyme de bizarrerie dans cette table.

  18. #18
    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
    OK, c'est bon à savoir.

  19. #19
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par SheikYerbouti Voir le message
    Il y a un problème avec la table dual.

    faites ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELETE FROM dual
    /
    INSERT INTO dual VALUES ('X')
    /
    J'ai exactement le même souci, seulement sous l'appli Apex disponible en ligne gratuitement sur le site d'Oracle je n'ai pas les droits nécessaires pour effectuer l'astuce. Existe-t-il un autre moyen pour contourner ce problème ?

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

Discussions similaires

  1. Fonction qui retourne plusieurs valeurs !
    Par casafa dans le forum C++
    Réponses: 20
    Dernier message: 23/04/2014, 16h56
  2. Réponses: 4
    Dernier message: 07/07/2008, 15h29
  3. Fonction retournent plusieurs valeurs
    Par Futixu dans le forum C++
    Réponses: 18
    Dernier message: 15/06/2006, 22h49
  4. Fonction retournant plusieurs valeurs
    Par Trap D dans le forum Scheme
    Réponses: 1
    Dernier message: 17/02/2006, 21h52
  5. [PL/SQL] Fonction qui retourne plusieurs valeurs
    Par Loko dans le forum Oracle
    Réponses: 2
    Dernier message: 07/12/2004, 09h43

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