PL/SQL

Résolu
soleil_levant Messages postés 426 Statut Membre -  
soleil_levant Messages postés 426 Statut Membre -
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.
Configuration: Windows XP / Firefox 3.6

4 réponses

  1. fiu
     
    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
  2. fiu
     
    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
  3. soleil_levant Messages postés 426 Statut Membre 32
     
    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
    1. BadGuitarist Messages postés 373 Statut Membre 27
       
      Tu as compris cette écriture-ci des curseurs ... il te reste encore quelques autres trucs à apprendre sur les curseurs sauce Oracle ;-)
      0
    2. soleil_levant Messages postés 426 Statut Membre 32
       
      Salut,
      ton pseudo dit tout sur ta personne :D bad vat!! Des commentaires de ce type sont null :)
      0
    3. BadGuitarist Messages postés 373 Statut Membre 27
       
      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
    4. soleil_levant Messages postés 426 Statut Membre 32
       
      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
  4. soleil_levant Messages postés 426 Statut Membre 32
     
    Ca me vas à merveille!!

    Merci infiniment :)
    0