Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/10/2004, 15h43   #1
Nouveau Membre du Club
 
Inscription : septembre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 28
Points : 29
Points : 29
Envoyer un message via MSN à Nicam
Par défaut [Postgres / JDBC] RecordSet et procedures stockées

Bonjour à vous.
Je me permes de poster ici car je n'ai toujours pas trouvé de reponses à mes questions.

Voilà, je developpe une application en JAVA s'appuyant sur une base de données PostgreSQL.

POur obtenir des données de la base, j'ai crée des procedures stockées qui fonctionnnent tres bien via PGadmin3.
Ces procedures stockés me retournent des enregistrements de plusieurs colonnes (recordset).

Le probleme viens de JDBC. Je n'arrive pas à recuperer mon RecordSet via JDBC.

Voici un exemple de procedure stockée (fonctionnel, rien a été modifié) :

Code:

CREATE OR REPLACE FUNCTION getalllibelleconsequence(text)
RETURNS SETOF consequence_list AS
$BODY$

declare
rl consequence_list%rowtype;
codeLangue ALIAS FOR $1;
begin
FOR rl IN
SELECT
id_consequence,libelle_consequence,id_lib_consequence
FROM
lib_consequence
WHERE
code_langue=codeLangue
LOOP

RETURN NEXT rl;
END LOOP;
RETURN;
end
$BODY$
LANGUAGE 'plpgsql' VOLATILE;



lorsque je fais en mode console :
Code:
select * from getalllibelleconsequence('FR');

Postgres me retourne bien mon recordset (ici, 8 enregistrements de 3 colonnes)

consequence_list a été correctement defini en amont.

Voici le code java associé :


Code:

conn.setAutoCommit(false);
CallableStatement cstmt = conn.prepareCall("{?= call GetAllLibelleConsequence ( ? ) }");
cstmt.registerOutParameter(1, Types.OTHER);
cstmt.setString(2, "FR");

cstmt.execute();
rs = (ResultSet)cstmt.getObject(1);
while(rs.next())
System.out.println(rs.getString("libelle_consequence"));

rs.close();
cstmt.close();
stmt.close();



En message d'erreur (sous eclipse), j'obtiens :

Code:

A CallableStatement Function was executed and the return was of type (java.sql.Types=4) however type=java.sql.Types=1111 was registered.


J'ai pourtant suivi la doc.
J'en deduis que le type en sortie n'est pas bon.
Effectivement, postgres me retourne un INTEGER (au lieu de mon recordset).
Je veux juste un record set, pas un interger (ici = 1, vas savoir pourquoi charles ...)
Je ne trouve aucune doc clair à ce sujet.
Le bouquin d'Oreilly est totalement muet à ce propos (c'est rare pour un Oreilly) ...

Help

Merci d'avance.[/i]
Nicam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2004, 16h54   #2
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Bonjour,

AMHA tu devrais utiliser un simple Statement plutôt qu'un CallableStatement ; je ne suis pas sûr que les SRF (Set Returning Functions) de Postgres soient totalement assimilables à des procédures stockées au sens de JDBC. Dans ce Statement, utilise ta requête "select * from getalllibelleconsequence('FR')".
__________________
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
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h36.


 
 
 
 
Partenaires

Hébergement Web