[java/oracle] procedures (PL/SQL) et Resulset
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:
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:
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:
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); |