Pregunta

Escribo un procedimiento simple. Intento almacenar el resultado de la selección en variable. Utilizo la consulta "Seleccionar en" pero no puedo hacer esto.

Ejemplo:

DECLARE
     v_employeeRecord  employee%ROWTYPE;
BEGIN
 SELECT * INTO v_employeeRecord
      FROM Employee WHERE Salary > 10;
END;
¿Fue útil?

Solución

Usted tiene un par de opciones. Podrías convertir esa consulta en un cursor:

DECLARE
     CURSOR v_employeeRecords IS
          SELECT * FROM Employee WHERE Salary > 10;
     v_employeeRecord  employee%ROWTYPE;
BEGIN
     FOR v_employeeRecord IN v_employeeRecords LOOP
          /* Do something with v_employeeRecord */
     END LOOP;
END;

O puede crear un TABLE variable:

DECLARE
     v_employeeRecord  employee%ROWTYPE;
     v_employeeRecords IS TABLE OF employee%ROWTYPE;
     i BINARY_INTEGER;
BEGIN
 SELECT * BULK COLLECT INTO v_employeeRecords
      FROM Employee WHERE Salary > 10;

 i := v_employeeRecords.FIRST;
 WHILE v_employeeRecords.EXISTS(i) LOOP
     v_employeeRecord := v_employeeRecords(i);
     /* Do something with v_employeeRecord */
     i := v_employeeRecords.NEXT(i);
 END;
END;

No he probado estas muestras en Oracle, por lo que puede recibir errores del compilador ...

Otros consejos

Si su selección devuelve más de una fila, no podrá usar la selección en SynThax.

Deberá construir un bucle para navegar a través del conjunto resultante:

Adán demostró cómo usaría un cursor explícito y un bucle de recolección a granel. Mostraré cómo puede construir el bucle más simple posible (cursor implícito, no necesita una sección de declaraciones):

BEGIN
   FOR c_emp IN (SELECT * 
                   FROM Employee 
                  WHERE Salary > 10) LOOP
      /* do something with each row, for example:*/
      UPDATE foo SET bar = bar + c_emp.salary WHERE id = c_emp.id;
   END LOOP;
END;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top