8 votes

Référence à un curseur dans un bloc anonyme

Comment pouvez-vous vous référer à la valeur spécifique d'un curseur si plusieurs valeurs sont retournées ?

DECLARE
  X INTEGER;
  CURSOR c1 IS SELECT col1, col2, col3.....;
BEGIN
  OPEN c1;
  LOOP
    EXIT WHEN c1%NOTFOUND;
    FETCH (col2 from c1) INTO X;
  END LOOP;
END;

16voto

Justin Cave Points 114578

Pourquoi le voudriez-vous ? Vraisemblablement, si vous sélectionnez trois colonnes dans votre déclaration de curseur, vous avez besoin des trois colonnes dans votre code, et vous devez donc récupérer les trois colonnes dans trois variables locales distinctes, c'est-à-dire

DECLARE
  x      integer;
  y      integer;
  z      integer;
  CURSOR c1
      IS SELECT column1, column2, column3
           FROM some_table;
BEGIN
  OPEN c1;
  LOOP
    FETCH c1 
     INTO x, y, z;
    EXIT WHEN c1%NOTFOUND;
  END LOOP;
  CLOSE c1;
END;

Vous pouvez également déclarer un type d'enregistrement basé sur la déclaration du curseur et extraire des données dans ce type d'enregistrement.

DECLARE
  CURSOR c1
      IS SELECT column1, column2, column3
           FROM some_table;
  c1_rec c1%ROWTYPE;
BEGIN
  OPEN c1;
  LOOP
    FETCH c1 
     INTO c1_rec;
    dbms_output.put_line( c1_rec.column2 );
    EXIT WHEN c1%NOTFOUND;
  END LOOP;
  CLOSE c1;
END;

Vous pouvez également vous débarrasser entièrement de la boucle explicite, ce qui est généralement l'approche préférée car vous n'avez pas à vous soucier des fuites de curseur et (dans les versions modernes) Oracle peut automatiquement effectuer des collectes en masse pour vous.

DECLARE
  CURSOR c1
      IS SELECT column1, column2, column3
           FROM some_table;
BEGIN
  FOR c1_rec IN c1
  LOOP
    dbms_output.put_line( c1_rec.column2 );
  END LOOP;
END;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X