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
KéKeCest ?? - 17 avril 2009 à 23:23
A voir également:
- Probleme avec procedure stockée en pl/sql
- Le point d'entrée de procédure est introuvable dans la bibliothèque de liens dynamiques ✓ - Forum Windows
- Point d'entrée de procédure introuvable ✓ - Forum Logiciels
- Logiciel sql - Télécharger - Bases de données
- Sql server recovery - Télécharger - Gestion de données
- Le point d'entrée de procédure eventsetinformation est introuvable advapi32.dll - Forum Windows
2 réponses
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;
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;
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
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.
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.
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+ !!.
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+ !!.