Oracle
 sql >> Base de données >  >> RDS >> Oracle

Curseur PL/SQL pour la boucle

*1. Vous avez besoin d'un SELECT et d'un point-virgule dans la définition du curseur

*2. Vous pouvez ajouter une BOUCLE FOR sur le curseur

Par exemple :

    DECLARE
      cursor c1 is
        SELECT street1
        from test_data;
      r1 c1%ROWTYPE;
    BEGIN
      FOR r1 IN c1 LOOP
         ... do your stuff with r1.street1
      END LOOP;
    END;

Vous pouvez également éviter complètement la définition explicite du curseur, par exemple :

FOR r1 IN (SELECT street1 FROM test_data) LOOP
   ... do your stuff with r1.street1
END LOOP;

*3. Vos instructions IF ne peuvent pas inclure de point-virgule ; par exemple :

    If
    Instr(r1.street1, 'Cnr', 1) >= 1
    Then

*4. [edit] si vous voulez mettre à jour votre table, colonnes newstreetnumber et newstreetname - auquel cas vous pourriez faire quelque chose comme ceci :

    DECLARE
      cursor c1 is
        SELECT street1
        from test_data
        FOR UPDATE;
      r1 c1%ROWTYPE;
    BEGIN
      FOR r1 IN c1 LOOP
         ... do your stuff with r1.street1
         UPDATE test_data
         SET newstreetnumber = ...
            ,newstreetname = ...
         WHERE CURRENT OF c1;
      END LOOP;
    END;

Notez, cependant, que cela ne fonctionnera pas bien pour les gros volumes, et je préférerais tout faire dans une seule instruction UPDATE.