2009-08-28 12 views
7

Escribo un procedimiento simple. Intento almacenar el resultado de la selección en variable. Uso la consulta "SELECCIONAR EN" pero no puedo hacer esto.Cómo almacenar el resultado de la selección en variable en el procedimiento de Oracle

Ejemplo:

DECLARE 
    v_employeeRecord employee%ROWTYPE; 
BEGIN 
SELECT * INTO v_employeeRecord 
     FROM Employee WHERE Salary > 10; 
END; 
+0

¿Puede darnos un ejemplo sencillo y el error de mensaje que aparece? –

+0

Puedo almacenar solo una fila, pero mi resultado de selección contiene muchas filas. –

Respuesta

11

usted tiene un par de opciones. Se podría 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 bien, puede crear una variable TABLE:

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 obtener errores de compilación ..

+0

Cursor resolver mi problema. –

+2

Tienes que usar "BULK COLLECT INTO" – jva

+0

@jva: ¡Gracias por la captura! –

7

SI su SELECT devuelve más de una fila, no podrá usar SELECT INTO synthax.

Usted tendrá que construir un circuito para navegar por el conjunto resulte:

Adam demostraron como se puede utilizar un cursor explícito y una mayor recoger bucle. Voy a mostrar cómo se puede construir el bucle más simple posible (cursor implícito, no necesita una sección de declaración):

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; 
+0

Buen ejemplo, gracias –

Cuestiones relacionadas