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 :

[debutant][procedure stockee][plpgsql][java] aucun retour !?


Sujet :

PostgreSQL

  1. #1
    Invité
    Invité(e)
    Par défaut [debutant][procedure stockee][plpgsql][java] aucun retour !?
    Bonjour,

    J'apprends à créer des procédures stockées sous postgres et je bloque dès le début.

    Ma procédure a pour but de valider la bonne connexion d'un utilisateur en fonction du login saisi et de son mot de passe. Voici son code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    DECLARE
      ident integer;
    BEGIN
      SELECT INTO ident id FROM admin.users WHERE login = login AND password = password;
     
      IF ident IS NULL THEN
        -- l'utilisateur n'existe pas
        RETURN -1;
      ELSE
        UPDATE admin.users SET connection = connection+1 WHERE id = ident;
        RETURN ident;	
      END IF;
    END;
    et voici mon appel en java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        CallableStatement stUser = null;
        stUser = conn.prepareCall("{? = call admin.isvalidlogon(?, ?)}");
     
        stUser.registerOutParameter(1, Types.INTEGER);
        stUser.setString(2, "tata");
        stUser.setString(3, "toto");
     
        stUser.executeUpdate();
     
        if (stUser.getInt(1) > -1) {
          System.out.println("Connexion autorisée");
        }
    et voici l'exception levée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    org.postgresql.util.PSQLException: Un CallableStatement a été exécuté mais n''a rien retourné.
    	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:340)
    	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:282)
    	at fr.ggl.utils.database.sp.ProcedureStockee.logon(ProcedureStockee.java:48)
    	at fr.ggl.utils.database.sp.ProcedureStockee.main(ProcedureStockee.java:19)
    Dernière modification par Domi2 ; 07/05/2011 à 20h18.

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    je ne suis pas sûr que ta chaine d'appel à la procédure stockée soit totalement compatible avec le driver JDBC pour PostgreSQL. Essaie plutôt une requête du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT admin.password('toto', '12345') AS logon
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Invité
    Invité(e)
    Par défaut
    ok j'ai trouvé mon erreur : il faut lancer execute() et no pas executeUpdate().

    seulement maintenant le problème viens de ma procédure, elle me retourne toujours le même id : 1. Quoique je mette en login et mot de passe.

    :

  4. #4
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    euh c'est plutot logique :
    tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE login = login AND password = password
    donc tu compare un champ avec le meme champ,
    replace par tes arguments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE login = $1 AND password = $2
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  5. #5
    Invité
    Invité(e)
    Par défaut
    oui c clair j'ais fait le changement grosse boulette

    voici mon nouveau code de procédure :

    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
     
    DECLARE
      ident integer;
    BEGIN
      SELECT INTO ident id FROM admin.users WHERE name = login AND pass = password;
     
      IF ident IS NULL THEN
        -- l'utilisateur n'existe pas
        RETURN -1;
      ELSE
        UPDATE admin.users SET connection = connection+1 WHERE id = ident;
        RETURN ident;	
      END IF;
     
    END;
    en java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CallableStatement stUser = null;
    stUser = conn.prepareCall("{ ? = call admin.isvalid( ?, ? ) }");
     
    stUser.registerOutParameter(1, Types.OTHER);
    stUser.setString(2, "tete");
    stUser.setString(3, "tete");
     
    stUser.execute();
     
    System.out.println("identifiant : " + stUser.getObject(1));
     
    stUser.close();
    Le problème maintenant c'est que mon update ne fait rien, certainement dû au fait que fais un execute() et non pas un executeUpdate().
    Mais un executeUpdate() n'est utilisable que si on ne retourne pas de valeur (si j'ai bien compris et c'était pas première erreur).

    Alors comment faire :

  6. #6
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    peux tu nous mettre le code complet de ta fonction (avec le create function ....) en plpgsql ?
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  7. #7
    Invité
    Invité(e)
    Par défaut
    OK :

    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
     
    CREATE OR REPLACE FUNCTION admin.isvalid("varchar", "varchar")
      RETURNS "unknown" AS
    $BODY$DECLARE
      ident integer;
    BEGIN
      SELECT INTO ident id FROM admin.users WHERE name = login AND pass = password;
     
      IF ident IS NULL THEN
        -- l'utilisateur n'existe pas
        RETURN -1;
      ELSE
        UPDATE admin.users SET connection = connection+1 WHERE id = ident;
        RETURN ident;	
      END IF;
     
    END;$BODY$
      LANGUAGE 'plpgsql' VOLATILE;
    ALTER FUNCTION admin.isvalid("varchar", "varchar") OWNER TO cristal;
    GRANT EXECUTE ON FUNCTION admin.isvalid("varchar", "varchar") TO public;
    GRANT EXECUTE ON FUNCTION admin.isvalid("varchar", "varchar") TO cristal;
    pourquoi ?

  8. #8
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    bah, c'est bien ce que je pensais tu ne declare pas login et password


    essaye sans declaration, juste les $1 et $2
    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
     
    CREATE OR REPLACE FUNCTION admin.isvalid(text,text) RETURNS integer AS
    $BODY$
    DECLARE
      ident integer;
    BEGIN
      SELECT INTO ident id FROM admin.users WHERE name = $1 AND pass = $2;
     
      IF ident IS NULL THEN
        -- l'utilisateur n'existe pas
        RETURN -1;
      ELSE
        UPDATE admin.users SET connection = connection+1 WHERE id = ident;
        RETURN ident;   
      END IF;
     
    END;
    $BODY$
    LANGUAGE 'plpgsql' VOLATILE;
    ou avec declaration
    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
     
    CREATE OR REPLACE FUNCTION admin.isvalid(text,text) RETURNS integer AS
    $BODY$
    DECLARE
      ident integer;
      login ALIAS FOR $1;
      password ALIAS FOR $2;
    BEGIN
      SELECT INTO ident id FROM admin.users WHERE name = login AND pass = password;
     
      IF ident IS NULL THEN
        -- l'utilisateur n'existe pas
        RETURN -1;
      ELSE
        UPDATE admin.users SET connection = connection+1 WHERE id = ident;
        RETURN ident;   
      END IF;
     
    END;
    $BODY$
    LANGUAGE 'plpgsql' VOLATILE;
    tu retourne un type unknown !!! j'ai mis integer
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  9. #9
    Invité
    Invité(e)
    Par défaut
    Mon SELECT fonctionne bien, c'est mon UPDATE qui ne fais rien.

    Pour l'histoire je l'ai crée avec phpPgAdmin, mais il ne marque pas l'en-tete de la proc (CREATE...) dans le code SQL qu'il affiche (il la marque dans arguments si tu l'as), je l'ai donc récupéré avec pgAdmin3 qui lui marque tout mais pas correctement, et je le constate grâce à ta remarque.

    C'est un peu compliqué je sais mais quand je l'ai crée avec phpPgAdmin j'avais mis en argument : "login" character varying, "password" character varying et en valeur de sortie, comme je fais des tests et que ma valeur à changée au fil du temps, j'avais mis au début "unknown" (disponible dans la liste, je ne sais pas vraiment à quoi ce correspond d'ailleur).

    En fait pgAdmin ne le marque pas dans l'en-tete mais les variables sont bien déclarées car mon select fonctionne.

    Mais comment faire pour que mon update soit pris en compte :

    pour être plus clair voici l'image phPgAdmin :

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/10/2007, 15h58
  2. [DEBUTANT]procedure stockee
    Par christophebmx dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 03/12/2004, 17h01
  3. [Debutant]procedure stockee ds un fichier texte
    Par christophebmx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/06/2004, 16h03
  4. [Debutant]Procedure stockee sous MSDE
    Par christophebmx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/04/2004, 11h39
  5. Réponses: 5
    Dernier message: 11/12/2003, 15h45

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