2011-01-18 17 views
11

Ho una tabella Emp con EmpID, Empname, Salary e sto provando a fare un calcolo per ogni impiegato. Ma sto avendo problemi cercando di ripetere su ogni emp per fare il calcolo. Non posso però usare cursori espliciti.Iterate su una colonna in PL/SQL

Così adesso sto solo cercando di creare l'elenco di 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; 

Ma ottengo l'errore: PLS-00320: la dichiarazione del tipo di questa espressione è incompleta o malformati

risposta

24

il modo più semplice per scorrere le righe di una tabella in PL/SQL è quello di fare qualcosa di simile

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

alternativa, è possibile recuperare tutte le EID Valori in una collezione PL/SQL e iterare sulla raccolta, come in questo esempio

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; 

Se la query può restituire migliaia di righe, tuttavia, il recupero di tutti i dati nella collezione può utilizzare più della memoria PGA di quanto vorresti e potresti aver bisogno di recuperare le righe in blocchi usando la clausola LIMIT. Ma sembrerebbe che stiamo superando noi stessi a questo punto.

+0

grazie per il tuo aiuto Justin, ma quando eseguo il tuo primo codice ma l'output di dbms è (eid) non (employees.eid), non lo stampa nel dbms outout. Sai perché? – Leo

+0

@ Leo- Che strumento stai usando? In SQL * Plus, è necessario eseguire il comando SET SERVEROUTPUT ON per abilitare l'output DBMS_OUTPUT. –

+0

@Leo: se hai mantenuto la sezione 'dichlare' allora' eid' potrebbe non essere inizializzato, quindi stamperà nulla - presupponendo che l'output del server sia abilitato. @Justin, dovresti avere 'dbms_output.put_line (employed.emp_id)', o un alias di colonna nel cursore? –

4

Justin Cave ha spiegato come farlo, ma per esaminare in modo specifico l'errore che hai, che è stato a causa di questo:

eid emp_ID%TYPE; 

Quando si utilizza il %TYPE è necessario specificare il nome della tabella, così come il nome della colonna:

eid emp.emp_ID%TYPE; 

Se si stavano selezionando tutte le colonne della riga che si potrebbe anche guardare %ROWTYPE.

Il tuo approccio stava anche facendo due ipotesi: che la selezione iniziale in eid ha trovato l'ID più basso, che non è affatto garantito; e che tutti i successivi valori ID sono sequenziali. E stai dichiarando e popolando aRows ma facendo riferimento a Tot_Rows.