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

PostgreSQL Discussion :

Exception : Récupérer erreur


Sujet :

PostgreSQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 255
    Points : 53
    Points
    53
    Par défaut Exception : Récupérer erreur
    Bonjour,

    J'effectue l'instruction suivante en PL/PgSQL



    select op.op_code, compo.parenth_gauche, compo.parenth_droite into opCompo, gauche, droite
    from composition compo, operateur op
    where compo.var_id = 2 and compo.crit_id = 1 and compo.op_id = op.op_id;

    query := gauche || opCompo || droite;

    RAISE EXCEPTION 'TOTO';
    Je sais que la requête se passe bien et me retourne les bonnes valeurs.
    En revanche du moment que j'utilise la variable gauche ou la variable droite dans mon code, la fonction ne me retourne rien...

    Si je mets
    query := gauche || opCompo || droite;
    La fonction ne me retourne rien

    alors que si je mets
    query := opCompo;
    La fonction me retourne bien que chaine de caractères



    J'ai donc ajouté le
    RAISE EXCEPTION 'TOTO';
    qui me met un super message d'erreur, très explicite
    ERROR: TOTO

    ********** Erreur **********

    ERROR: TOTO
    État SQL 0001
    N'y-a-t-il pas moyen de récupérer l'exception qui a engendré mon erreur.
    Je ne sais pas ce qui fait planter mon code...

    Merci
    "Patience et longueur de temps font plus que force ni que rage ..."

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 255
    Points : 53
    Points
    53
    Par défaut
    snifff
    "Patience et longueur de temps font plus que force ni que rage ..."

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    L'erreur est celle que tu as généré toi-même : "TOTO".

    Pour ton premier soucis, peux-tu poster le code complet ? Avec des bouts de code comme ça c'est très difficile de voir ce qui peut clocher...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 255
    Points : 53
    Points
    53
    Par défaut
    Le code est entier,
    c'est juste que je l'ai décomposé par la suite pour expliquer chaque instruction.


    Pour l'exception, c'est effectivement mon message d'erreur, mais j'aimerais avoir l'équivalent d'une pile d'erreur pour savoir ce qui cloche.

    Du style
    RAISE EXCEPTION e
    Avec e qui soir ma pile d'exceptions
    "Patience et longueur de temps font plus que force ni que rage ..."

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 255
    Points : 53
    Points
    53
    Par défaut
    CREATE OR REPLACE FUNCTION build_compo(varId integer) RETURNS character varying AS
    $BODY$
    DECLARE
    gauche character varying := '';
    droite character varying := '';
    opCompo character varying := '';
    compos integer[];
    nbCompos integer := 0;
    ii integer := 0;

    query character varying := '';
    _operateur character varying := '';

    BEGIN

    -- On compte le nombre d'éléments qui forment la composition
    select count(*) into nbCompos from composition where var_id = varId;

    if nbCompos=0 then

    return null;

    else

    --On charge les éléments de la composition
    select into compos array(select crit_id from composition where var_id = varId order by indice);

    FOR ii IN 1..nbCompos LOOP

    --select compo.parenth_gauche, compo.parenth_droite, op.op_code into gauche, droite, opCompo from composition compo, operateur op where compo.var_id = var_id and compo.crit_id = compos[ii] and compo.op_id = op.op_id;
    select op.op_code, compo.parenth_gauche, compo.parenth_droite into opCompo, gauche, droite from composition compo, operateur op where compo.var_id = varId and compo.crit_id = compos[ii] and compo.op_id = op.op_id;


    -- ...et on construit la requête en fonction
    query := query || gauche || build_critere(compos[ii]) || droite || _operateur;
    --whereClause := whereClause || build_where_critere(compos[ii]) || ' ' || opCompo || ' ';

    END LOOP;

    end if;

    return query;

    END;
    $BODY$
    LANGUAGE 'plpgsql' VOLATILE;
    ALTER FUNCTION build_compo(integer) OWNER TO postgres;
    "Patience et longueur de temps font plus que force ni que rage ..."

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Ah merci, avec tout le code c'est mieux !

    Dis-moi où sont déclarés "gauche" et "droite" ? Bizarre que ça compile...

    Si une exception était générée tu l'aurais récupérée de la même manière que celle que tu avais créée.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 255
    Points : 53
    Points
    53
    Par défaut
    Désolé, me suis trompé de code.
    J'ai modifié le post précédent avec le bon code...

    Merci
    "Patience et longueur de temps font plus que force ni que rage ..."

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    A première vu avec le code modifié , rien ne me choque...

    Tu peux poster quelques enregistrements, le résultat que tu obtiens actuellement et celui que tu attends ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 255
    Points : 53
    Points
    53
    Par défaut
    Du moment que j'utilise les variables droite ou gauche dans le code, le retour est une chaine vide ==> il y a bien un plantage
    query := query || gauche || build_critere(compos[ii]) || droite || _operateur;
    Si je n'utilise pas les variables droite ou gauche dans le code,
    query := query || build_critere(compos[ii]) || _operateur;
    le retour est une chaine de caractères du style

    select col from table where crit...
    UNION
    select col from table2 where crit2...
    etc...
    "Patience et longueur de temps font plus que force ni que rage ..."

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Citation Envoyé par the java lover Voir le message
    Du moment que j'utilise les variables droite ou gauche dans le code, le retour est une chaine vide ==> il y a bien un plantage
    Non non pas de plantage, juste droite ou gauche qui est NULL .

    N'importe quoi concaténé avec NULL renvoie NULL (pas chaine vide).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COALESCE('1' || NULL, 'NULL');
     
    "NULL"

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 255
    Points : 53
    Points
    53
    Par défaut
    Tu as bien raison.
    Ce sont mes variables qui sont bien nulles mais je ne comprends pas pourquoi, il y a bien des valeurs que je remonte en bd.

    As-tu une idée au vu de mon code ?
    "Patience et longueur de temps font plus que force ni que rage ..."

Discussions similaires

  1. Récupérer erreurs DTS
    Par elsuket dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/11/2006, 12h56
  2. [Exception] creation erreur.
    Par florantine dans le forum Langage
    Réponses: 1
    Dernier message: 13/01/2006, 20h26
  3. [XSL]Récupérer erreur de la fonction document() ?
    Par Chips dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 16/05/2005, 18h03
  4. [Exceptions] récupérer erreur oracle
    Par zach dans le forum Langage
    Réponses: 21
    Dernier message: 23/02/2005, 09h34
  5. [Exception] Récupérer l'exception correspondante
    Par Mister Nono dans le forum Langage
    Réponses: 2
    Dernier message: 09/06/2004, 18h47

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