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

JDBC Java Discussion :

Retourner plusieurs lignes grâce à une procédure stockée


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 27
    Points : 19
    Points
    19
    Par défaut Retourner plusieurs lignes grâce à une procédure stockée
    Bonsoir,

    J'ai voulu créer un programme de test dans lequel j'affiche le contenu de ma table en utilisant une procédure stockée, le problème est que je ne reçois qu'une seule ligne sur les 200 de ma table !

    Voici mon code Java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    System.out.println("---Début test---");
    CallableStatement call = con.prepareCall("{call p_maProcedureT1()}");
    call.execute();
    ResultSet resultat = call.getResultSet();
     
    while(resultat.next()){
    	System.out.println("Colonne 1 : " + resultat.getInt(1) + " Colonne 2 : "+ resultat.getInt(2));
    }
    resultat.close();
    call.close();
    System.out.println("---Fin test---");

    Voici l'affichage console :
    ---Début test---
    Colonne 1 : 176 Colonne 2 : 1
    ---Fin test---

    J'ai aussi essayé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ResultSet resultat = call.executeQuery();
    Mais c'est le même résultat.

    Je me suis rendu compte qu'en ajoutant un ORDER BY id à ma procédure que je recevais la première ligne de la table, mais ça s'arrête là, je ne reçois qu'une seule ligne sur les 200.

    Voici ma procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     CREATE FUNCTION p_maproceduret1(out identifiant integer, out valeur integer)
    AS
    $BODY$
    BEGIN
     
    SELECT id, vala INTO identifiant, valeur FROM t1 ORDER BY id;
     
    END;
    $BODY$
    LANGUAGE plpgsql;
    -- PS: Ceci est une procédure, pas une fonction


    Peut-on retourner plusieurs lignes d'une table à partir d'une procédure stockée ?
    Est-ce que je me suis trompé dans la syntaxe ?
    D'où pourrait venir mon problème ?
    Pourriez-vous me montrer un exemple simple pour l'affichage de mes 2 colonnes avec une procédure ?

    Je suis sous PostgreSQL et je me sers de variable en mode OUT/INOUT pour récupérer mes résultats.



    J'ai bien suivi le tutoriel sur Callable Statement du site et malgré cela je bloque depuis plusieurs jours sur ce problème...

    Je vous remercie pour votre aide.

    EDIT : orthographe

  2. #2
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 084
    Points
    7 084
    Par défaut
    Tu n'as pas précis à JDBC que tu avais des paramètres à ta procédure stockée, pas plus que ce sont des paramètres de sorties.
    Estimes-toi déjà heureux d'avoir un résultat !

    Ensuite ta procédure ne renvoie qu'un seul couple (identifier, valeur).

    Enfin SELECT id, vala INTO identifiant, valeur FROM t1 ORDER BY id; aurait dû te renvoyer une erreur s'il existe plusieurs valeurs sinon ce n'est pas logique.

    Sous Oracle il est possible de "renvoyer" (soit par une function, soit en paramètre out d'une procédure) des curseur qui sont assimilés à des ResultSet côté JDBC.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Merci pour ton attention Nemek,

    Je n'ai pas réussis à obtenir un résultat autrement que de passer par cette syntaxe pour obtenir un résultat.

    Lorsque je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CallableStatement call = con.prepareCall("{call p_maProcedureT1(?, ?)}");
    J'ai le message d'erreur suivant qui apparait :
    Pas de valeur spécifiée pour le paramètre 1.

    Sinon pour la syntaxe de la requête c'est ok :
    SELECT id, vala INTO identifiant, valeur FROM t1 ORDER BY id;
    elle est peut-être spécifique à PostgreSQL je ne sais pas.


    Pourrais-tu me montrer un exemple simple basé sur ce que je souhaite réaliser ?


    Merci

  4. #4
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 084
    Points
    7 084
    Par défaut
    Citation Envoyé par guk92 Voir le message
    Je n'ai pas réussis à obtenir un résultat autrement que de passer par cette syntaxe pour obtenir un résultat.

    Lorsque je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CallableStatement call = con.prepareCall("{call p_maProcedureT1(?, ?)}");
    J'ai le message d'erreur suivant qui apparait :
    Normal,

    La requête indique à JDBC qu'il y a 2 paramètres mais rien ne lui ai fournie. Dans ce cas il faut indiquer qu'il s'agit de deux paramètres "out" via les méthodes "registerOutParameter".

    Citation Envoyé par guk92 Voir le message
    Pourrais-tu me montrer un exemple simple basé sur ce que je souhaite réaliser ?
    J'en ai pas sous la main et le seul que je pourrais avoir concerne Oracle.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    J'ai compris d'où venait le problème, j'essaye en faite de retourner plusieurs résultats, mais je n'ai retourne qu'un seul, utiliser un procédure n'est pas comme utiliser une requête. Il faut retourner plusieurs valeurs, soit une table, le plus compliqué c'est de connaitre la syntaxe du SGBD que l'on utilise.

    Je te remercie pour ces réponses, si tu souhaite mettre la syntaxe d'une procédure Oracle pour retourner plusieurs valeurs n'hésite pas.

  6. #6
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 084
    Points
    7 084
    Par défaut
    Rapidement :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Connection connection = /*Create connection*/;
    CallableStatement callableStatement = connection.prepareCall("{call MY_PROCEDURE(?)}");
    callableStatement.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
    callableStatement.execute();
    ResultSet resultSet = (ResultSet) callableStatement.getObject(1);

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE OR REPLACE PROCEDURE "MY_PROCEDURE" (myCursor OUT SYS_REFCURSOR)
    AS
      OPEN myCursor FOR SELECT * FROM MY_TABLE;
    END;

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

Discussions similaires

  1. [DEBUTANT]Récupérer plusieurs champs dans une procédure stockée
    Par tripper.dim dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/06/2007, 17h58
  2. Récupérer plusieurs lignes avec des procédures stockées
    Par GPZ{^_^} dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 12/03/2007, 13h16
  3. Récupérer la valeur d'une ligne dans une procédure stockée
    Par mobscene dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 07/12/2006, 19h29
  4. Comment retourner plusieurs paramétre d'une procedure stockée?
    Par nic413 dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 24/06/2006, 18h30
  5. Procédure stockée - Retourner plusieurs ligne d'une table
    Par ronando dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 02/11/2005, 13h19

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