Cómo almacenar la selección del resultado en variable en el procedimiento de Oracle
-
20-09-2019 - |
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;
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;