Probleme avec procedure stockée en pl/sql

Fermé
tipi75 Messages postés 680 Date d'inscription lundi 20 août 2007 Statut Membre Dernière intervention 16 avril 2015 - 17 avril 2009 à 21:06
 KéKeCest ?? - 17 avril 2009 à 23:23
Bonsoir tout le monde,

Je suis en train de faire la gestion des réservations de terrains de tennis

Je viens de faire une procédure stockée afin de récupérer toutes les disponibilitées sur 1 mois, cependant il y a un soucis sur ma procédure.En fait, elle ne boucle pas, on a l'impression qu'elle ne s'arrête jamais. A chaque fois je dois arrêter en faisant un ctrl+alt+suppr.

Voici mon code pl/sql:


create or replace procedure disponible as


cursor c_reservation is SELECT libTerrain, heureRéserver, dateRéserver
FROM adhérents, terrains , réserver
WHERE numAdhérent = numAdhérentRéserver
AND numTerrainRéserver = numTerrain
AND dateRéserver BETWEEN sysdate and (ADD_MONTHS (SYSDATE, +1))
order by libTerrain desc,dateRéserver desc, heureRéserver;

v_libTerrain terrains.libTerrain%type;
v_heureReserver réserver.heureRéserver%type;
v_dateReserver réserver.dateRéserver %type;


dateCourante date;
libTerrainCourant varchar2(50);
heureReserverCourant number;

type tabHoraire is varray (6) of number;
lesHoraires tabHoraire := tabHoraire(10,11,12,13,14,15);
j number;

type tabReserver is varray (6) of number;
resa tabReserver := tabReserver();

i number := 0;
heureResaTempo number;
horaireTempo number;
k number;
nbr number := 0;

horaireExist boolean := false;

table_disponible number := 0;
BEGIN

select count(*) into table_disponible from user_tables where upper(table_name) = 'horaire_disponible';

if table_disponible = 1 then
execute immediate 'TRUNCATE TABLE horaire_disponible';
end if;

open c_reservation;
fetch c_reservation into v_libTerrain, v_heureReserver, v_dateReserver;
while c_reservation%found
loop
dateCourante := v_dateReserver;
libTerrainCourant := v_libTerrain;
heureReserverCourant := v_heureReserver;
i := 1;

while c_reservation%found and dateCourante = v_dateReserver and libTerrainCourant = v_libTerrain
loop
resa.extend;
resa(i) := v_heureReserver;
i := i + 1;
fetch c_reservation into v_libTerrain, v_heureReserver, v_dateReserver;
end loop;

nbr := resa.count;
j := 1;

while j <= 6
loop
horaireTempo := lesHoraires(j);
k := 1;


while k <= nbr and horaireExist = false
loop
heureResaTempo := resa(k);
if horaireTempo = heureResaTempo then
horaireExist := true;
else
k := k + 1;
end if;
end loop;
end loop;


if horaireExist = false then
INSERT INTO horaire_disponible (terrainDispo, dateDispo, heureDispo) values (libTerrainCourant,dateCourante,horaireTempo);

else
horaireExist := false;
end if;
j := j + 1;
end loop;

close c_reservation;

END;





Merci pour votre aide

2 réponses

KéKeCest ??
17 avril 2009 à 22:04
Slt,

J'ai pas bien lu tout ton code mais j'ai identifié une raison de boucle infinie.

Tu a cette section de code et j n'est jamais incrémenté dans tes deux loop (il l'est après cela dit...)
-> la condition de loop est toujours vérifiée et tu boucles infiniment.

A+ !.

j := 1;
while j <= 6
// 1er loop
loop
horaireTempo := lesHoraires(j);
k := 1;
while k <= nbr and horaireExist = false
// 2eme loop
loop
heureResaTempo := resa(k);
if horaireTempo = heureResaTempo then
horaireExist := true;
else
k := k + 1;
end if;
// fin 2eme loop
end loop;
// fin 1er loop
end loop;
0
tipi75 Messages postés 680 Date d'inscription lundi 20 août 2007 Statut Membre Dernière intervention 16 avril 2015 27
17 avril 2009 à 22:49
je crois que j'ai modifié mon code un peu. Si tu as une idée pour un algo pour récupérer que les plages horaires disponible, je suis preneur.

Regarde si tu veux:


create or replace procedure disponible as


cursor c_reservation is SELECT libTerrain, heureRéserver, dateRéserver
FROM adhérents, terrains , réserver
WHERE numAdhérent = numAdhérentRéserver
AND numTerrainRéserver = numTerrain
AND dateRéserver BETWEEN sysdate and (ADD_MONTHS (SYSDATE, +1))
order by libTerrain desc,dateRéserver desc, heureRéserver;

v_libTerrain terrains.libTerrain%type;
v_heureReserver réserver.heureRéserver%type;
v_dateReserver réserver.dateRéserver %type;


dateCourante date;
libTerrainCourant varchar2(50);
heureReserverCourant number;

type tabHoraire is varray (6) of number;
lesHoraires tabHoraire := tabHoraire(10,11,12,13,14,15);
j number;

type tabReserver is varray (6) of number;
resa tabReserver := tabReserver();

i number := 0;
heureResaTempo number;
horaireTempo number;
k number;
nbr number := 0;

horaireExist boolean := false;

table_disponible number := 0;
BEGIN

select count(*) into table_disponible from user_tables where upper(table_name) = 'horaire_disponible';

if table_disponible = 1 then
execute immediate 'TRUNCATE TABLE horaire_disponible';
end if;

open c_reservation;
fetch c_reservation into v_libTerrain, v_heureReserver, v_dateReserver;
exit when c_reservation%notfound;

dateCourante := v_dateReserver;
libTerrainCourant := v_libTerrain;
heureReserverCourant := v_heureReserver;
i := 1;

while c_reservation%found and dateCourante = v_dateReserver and libTerrainCourant = v_libTerrain
loop
resa.extend;
resa(i) := v_heureReserver;
i := i + 1;
fetch c_reservation into v_libTerrain, v_heureReserver, v_dateReserver;
end loop;

nbr := resa.count;
j := 1;

while j <= 6
loop
horaireTempo := lesHoraires(j);
k := 1;


while k <= nbr and horaireExist = false
loop
heureResaTempo := resa(k);
if horaireTempo = heureResaTempo then
horaireExist := true;
else
k := k + 1;
end if;
end loop;

if horaireExist = false then
INSERT INTO horaire_disponible (terrainDispo, dateDispo, heureDispo) values (libTerrainCourant,dateCourante,horaireTempo);
else
horaireExist := false;
end if;
j := j + 1;

end loop;

close c_reservation;

END;




A+ merci.
0
KéKeCest ??
17 avril 2009 à 23:23
Salut tipi75,

Je crois que c'est toi qui m'a posé un liste de "colles" en PL/SQL il y a deux jours (:>)..

J'ai donc vu que t'avais déplacé ton incrémentation de j pour que ton code ne boucle pas - OK.

Je n'ai pas le temps ce soir de voir cet autre problème pour ma part mais je te signale que la fonction UPPER() convertit une chaine en MAJUSCULE :

Ton code :

select count(*) into table_disponible from user_tables where upper(table_name) = 'horaire_disponible';

> Tu devrais plutôt coder ainsi si tu veux récupérer des enregistrements :

select count(*) into table_disponible from user_tables where upper(table_name) = 'HORAIRE_DISPONIBLE';

A+ !!.
0