Bonjour,

alors voilà, dans mon projet de BDD, il est imposé d'utiliser des procédures et fonctions ecrites en PL/SQL au lieu de directement ecrire la requete dans la programme java.

Le probleme c'est qu'avec la procédure que j'ai créée sous oracle, le ResultSet est toujours vide... je ne sais pas si c'est mon programme ou ma procédure qui est mal ecrit :


la procédure doit SIMPLEMENT AFFICHER LE RESULTAT DE LA REQUETE en affectant les variables données en parametre. Je précise que la requete seule fonctionne très bien, et que si j'execute la procedure dans Oracle, les résultats s'affichent... :

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
22
23
24
25
26
CREATE OR REPLACE PROCEDURE Cherche_Exp_Dispo(nomFilm ens2004.FILM.Titre%TYPE) IS
 
CURSOR Curseur IS
 
SELECT NumExemplaire 
FROM ens2004.EXEMPLAIRE E, ens2004.FILM F 
WHERE E.NumFilm = F.NumFilm 
AND Titre=nomFilm
AND E.NumExemplaire 
NOT IN (SELECT NumExemplaire 
	   FROM LOCATION 
	   WHERE DateEnvoi IS NOT NULL 
	   AND DateRetour IS NULL 
         AND TitreFilm=nomFilm);
 
numExp ens2004.EXEMPLAIRE.NumExemplaire%TYPE;
BEGIN
	OPEN Curseur;
	LOOP 
		FETCH Curseur INTO numExp;
		EXIT WHEN (Curseur%NOTFOUND);
		DBMS_OUTPUT.PUT_LINE(numExp || ' ');
	END LOOP;
	CLOSE Curseur;
END;
/

et voilà la partie java :

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
CallableStatement cs = co.prepareCall("{call Cherche_Exp_Dispo(?)}");
cs.setString(1, NomFilm);
cs.execute();
ResultSet rs = cs.getResultSet();
 
 
// Si le resultSet contient au moins un résultat (un exemplaire libre)
// on note le premier exemplaire de libre
if(rs.next()){
	ExpLibre=rs.getString(1);
}
 
// Sinon on refuse la location et on affiche pourquoi
else {
	JOptionPane.showMessageDialog(this, "Pas d'exemplaire disponible");
	locationPossible=false;
}	
 
cs.close();
rs.close();

Déjà je pense que ma procédure n'est pas bonne car j'ai trouvé une procédure sous My SQL de ce genre, qui permet juste d'afficher le resultat de la requete, mais sous Oracle on ne peut pas ecrire une procedure comme ça :

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 PROCEDURE Cherche_Exp_Dispo(nomFilm ens2004.FILM.Titre%TYPE) AS
 
SELECT NumExemplaire 
FROM ens2004.EXEMPLAIRE E, ens2004.FILM F 
WHERE E.NumFilm = F.NumFilm 
AND Titre=nomFilm
AND E.NumExemplaire 
NOT IN (SELECT NumExemplaire 
	   FROM LOCATION 
	   WHERE DateEnvoi IS NOT NULL 
	   AND DateRetour IS NULL 
         AND TitreFilm=nomFilm);