2012-05-17 11 views
7

Ho una procedura che esegue alcuni calcoli su tutti i record restituiti da un cursore. Sembra un po 'come questo:Posso passare un cursore esplicito a una funzione/procedura da utilizzare nel ciclo FOR?

PROCEDURE do_calc(id table.id_column%TYPE) 
IS 
    CURSOR c IS 
    SELECT col1, col2, col3 
     FROM table 
    WHERE ...; 
BEGIN 
    FOR r IN c LOOP 
    -- do some complicated calculations using r.col1, r.col2, r.col3 etc. 
    END LOOP; 
END; 

Ora ho il caso in cui ho bisogno per eseguire lo stesso calcolo esatto su un diverso insieme di record che provengono da una tabella diversa. Tuttavia, questi hanno la stessa "forma" come nell'esempio precedente.

E 'possibile scrivere una procedura che assomiglia a questo:

PROCEDURE do_calc2(c some_cursor_type) 
IS 
BEGIN 
    FOR r IN c LOOP 
    -- do the calc, knowing we have r.col1, r.col2, r.col3, etc. 
    END LOOP; 
END; 

che so di SYS_REFCURSOR, ma mi chiedevo se fosse possibile utilizzare il molto più conveniente FOR ... LOOP sintassi e il tipo di registrazione implicita.

risposta

8

Creare un pacchetto.

Dichiarare il cursore come variabile del pacchetto.

Utilizzare %rowtype per impostare il tipo di parametro della funzione.

create or replace package test is 
    cursor c is select 1 as one, 2 as two from dual; 

    procedure test1; 
    function test2(test_record c%ROWTYPE) return number; 

end test; 


create or replace package body test is 
    procedure test1 is  
    begin 
    for r in c loop  
     dbms_output.put_line(test2(r)); 
    end loop; 
    end; 

    function test2(test_record c%ROWTYPE) return number is 
    l_summ number; 
    begin 
    l_summ := test_record.one + test_record.two; 
    return l_summ; 
    end; 
end test; 
+0

Grazie Vasily, non ero sicuro di PL/SQL in grado di gestire quel livello di battitura structual, ma funziona come un incantesimo! :-) –

+0

Prego) –

+0

hi @VasilyKomarov .. cosa succede se l'istruzione del cursore ha un parametro che si passa come input a tutte le funzioni e le procedure nel pacchetto .. come ad esempio .. il cursore c è selezionato 1 come uno, 2 come due dal doppio dove row = row_id; dove row_id è il parametro – thealchemist

0

Sì, è possibile utilizzare il cursore in modo esplicito nella procedura e la funzione, per quella del cursore bisogno di dichiarare in pacchetto come variabile

Problemi correlati