2011-01-18 14 views
11

Tengo una tabla Emp con EmpID, Empname, Salario y estoy tratando de hacer un cálculo para cada empleado. Pero estoy teniendo problemas tratando de iterar sobre cada emp para hacer el cálculo. Sin embargo, no puedo usar cursores explícitos.Iterar sobre una columna en PL/SQL

Así que en este momento estoy tratando de crear la lista de Empids:

Declare 
    aRows Number; 
    eid emp_ID%TYPE; 
Begin 
    Select Count(*) 
    Into aRows 
    from emp; 

    Select emp_ID 
    Into eid 
    From emp; 

    FOR days IN 1..Tot_Rows 
    Loop 
     Dbms_Output.Put_Line(eid); 
     eid := eid + 1; 
    End Loop; 
END; 

Pero me sale el error: PLS-00320: la declaración del tipo de esta expresión está incompleta o mal formado

Respuesta

24

la forma más sencilla para repetir las filas de una tabla en PL/SQL es hacer algo como

BEGIN 
    FOR employees IN (SELECT emp_id FROM emp) 
    LOOP 
    dbms_output.put_line(employees.emp_id); 
    END LOOP; 
END; 

como alternativa, se pudo obtener toda la EID valores en una colección PL/SQL y iterar sobre la colección, como en este ejemplo

DECLARE 
    TYPE emp_id_tbl IS TABLE OF emp.emp_id%type; 
    l_emp_ids emp_id_tbl ; 
BEGIN 
    SELECT emp_id 
    BULK COLLECT INTO l_emp_ids 
    FROM emp; 

    FOR i IN l_emp_ids .FIRST .. l_empnos.LAST 
    LOOP 
    dbms_output.put_line(l_emp_ids (i)); 
    END LOOP; 
END; 

Si su consulta puede devolver miles de filas, sin embargo, ir a buscar todos los datos en la colección puede usar más de la memoria PGA de lo que desearía y es posible que necesite buscar filas en fragmentos utilizando la cláusula LIMIT. Pero eso parece estar adelantado en este momento.

+0

gracias por su ayuda Justin, pero cuando ejecuto su primer código pero el resultado de dbms es (eid) no (employees.eid), no lo imprime en el resumen de dbms. ¿Sabes por qué? – Leo

+0

@ Leo- ¿Qué herramienta estás usando? En SQL * Plus, debe ejecutar el comando SET SERVEROUTPUT ON para habilitar la salida DBMS_OUTPUT. –

+0

@Leo: si guardó la sección 'declare',' eid' no se puede inicializar, por lo que se imprimirá nulo, suponiendo que tiene habilitada la salida del servidor. @Justin, ¿debería tener 'dbms_output.put_line (employed.emp_id)', o un alias de columna en el cursor? –

4

Justin cueva ha explicado cómo hacerlo, sino para estudiar específicamente el error que tienes, eso fue debido a esto:

eid emp_ID%TYPE; 

Cuando se utiliza el %TYPE tiene que especificar el nombre de la tabla, así como el nombre de la columna:

eid emp.emp_ID%TYPE; 

si estuviera seleccionando todas las columnas de la fila también se puede mirar a %ROWTYPE.

Su enfoque también tenía dos suposiciones: que la selección inicial en eid encontró la ID más baja, lo que de ninguna manera está garantizado; y que todos los valores de ID subsiguientes son secuenciales. Y está declarando y completando aRows pero refiriéndose a Tot_Rows.