PL/SQL

Résolu/Fermé
soleil_levant Messages postés 393 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 14 avril 2011 - 17 mars 2010 à 23:45
soleil_levant Messages postés 393 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 14 avril 2011 - 22 mars 2010 à 21:58
Bonjour,
J'ai une procédure à faire sous oracle 10g. C'est un test simple qui convertie tous les salaires de la table démo emp appartenant au fameux utilisateur scott vers des salaires divisés par 1.2
Le but est de passer par les curseurs. Voici ma procédure :
DECLARE
CURSOR mon_troixieme is
select empno, ename, job, mgr, hiredate, sal/1.2 as sal_fr, comm/1.2 as comm_fr, deptno from emp;
CURSOR nombre is
select count(*) from emp;
--employe EMP%ROWTYPE;
total_ligne varchar2(5);
num emp.empno%type;
nom EMP.ENAME%type;
trav emp.job%type;
mgr EMP.MGR%type;
dat EMP.HIREDATE%type;
sal_f emp.sal%type;
comm_f emp.comm%type;
dep emp.deptno%type;
BEGIN
OPEN nombre;
OPEN mon_troixieme;

Loop
Fetch mon_troixieme INTO num, nom,trav, mgr, dat, sal_f, comm_f, dep;
--INSERT INTO emp_fr
INSERT INTO EMP_FR VALUES(num, nom,trav, mgr, dat, sal_f, comm_f, dep);

--DBMS_OUTPUT.PUT_LINE(EMPLOYE.SAL || '|'||EMPLOYE.COMM);
EXIT WHEN mon_troixieme%NOTFOUND;
End Loop;

Fetch nombre INTO total_ligne;
DBMS_OUTPUT.PUT_LINE('Total inséré dans table : ' || total_ligne);
COMMIT;
CLOSE nombre;
CLOSE mon_troixieme;
END;
/


Le soucis c'est que la dans la table destination de l'insert (emp_fr) il ya une ligne en trop. Il ya en faite tjrs la dernière ligne qui s'ajoute.

Avez vous une réponse s'il vous plait? Je n'arrive pas à insérer exactement les 14 lignes que contient la table source emp. Il ya tjrs 15 insérés?

Merci par avance.

4 réponses

Salut

place ton insert APRES ton exit when

de plus, même si c'est un exo sur les curseurs, on ne fait pas un curseur pour une ligne.
donc ton nombre, c'est
declare
nombre : number;
... autres declarations
begin
select count(*) into nombre from emp;


mais si le but est de compter les lignes traitees, ton algo est alors faux et tu dois plutot mettre
declare
nombre : numer := 0;
... autres decl
begin
open theCursor;
loop
fetch ...
exit when theCursor%notfound;
update emp ... etc
nombre := nombre +1; -- je viens de traiter une ligne
end loop;
close theCursor;
dbms_output.put_line(nombre||' lignes traitee(s)');

voilà !
maintenant que t'es sur de bons rails, je ne peux m'empecher de te conseiller la lecture de la doc de l'option FOR UPDATE des curseurs... ca te permettrait un curseur genre select * ... et un update genre update set col=theCursor.col*1.2 where ...
1
Salut

Bin là, on sort du cours sur les curseurs pour entrer dans celui de la logique, de l'algorithmique.
exit when curseur%NOTFOUND sert à sortir d'une boucle si plus rien n'est à lire dans le curseur. on l'utilise normalement juste après le fetch, on s'évite ainsi d'exécuter des instructions qui nécessitent des données du curseur.

imaginons être à la fin du curseur (la dernière ligne valide a été lue lors du passage précédent)
fetch curseur into var1, var2 etc -- il n'y avait plus rien à lire : var1, var2 etc ne contiennent que du vent
insert into matable values(var1, var2, etc) -- j'insère du vent
exit when curseur%NOTFOUND -- et maintenant on quitte la boucle
... t'as inséré "du vent"

si tu intervertis l'exit avec l'insert, l'exit te permet de sortir AVANT d'insérer du vent !
fetch curseur into var1, var2 etc -- il n'y avait plus rien à lire : var1, var2 etc ne contiennent que du vent
exit when curseur%NOTFOUND -- maintenant on quitte la boucle
insert into matable values(var1, var2, etc) -- et rien n'est inséré !

ça te va ?
1
soleil_levant Messages postés 393 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 14 avril 2011 32
20 mars 2010 à 02:41
Ok ca roule à merveille !!

Mais une dernière question, pourquoi quand je place l'insertion après la vérification de fin du curseur il y plus de ligne supplémentaire!!

Thanks a lot, après cette dernière question, je pourrais au moins prétendre comprendre les curseurs sous oracle :D

Résolut
0
BadGuitarist Messages postés 367 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 20 octobre 2013 27
21 mars 2010 à 02:10
Tu as compris cette écriture-ci des curseurs ... il te reste encore quelques autres trucs à apprendre sur les curseurs sauce Oracle ;-)
0
soleil_levant Messages postés 393 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 14 avril 2011 32
21 mars 2010 à 13:53
Salut,
ton pseudo dit tout sur ta personne :D bad vat!! Des commentaires de ce type sont null :)
0
BadGuitarist Messages postés 367 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 20 octobre 2013 27
22 mars 2010 à 02:01
Pourquoi m'injuries-tu avec ta psycho à 2 balles ?
Il existe effectivement plusieurs écritures de curseurs : les curseurs implicites, les curseurs explicites, les curseurs paramétrés ...
Mais je te laisse à tes connaissances ... suffisantes certainement.
0
soleil_levant Messages postés 393 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 14 avril 2011 32
22 mars 2010 à 21:58
Autant pour moi :D
Je ne t'ai pas injurié, si tu l'as pris mal je m'en excuse!
ton premier commentaire je le trouve infructueux comme ca ! mais le second l'est!
a+
0
soleil_levant Messages postés 393 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 14 avril 2011 32
20 mars 2010 à 12:08
Ca me vas à merveille!!

Merci infiniment :)
0