2012-05-17 9 views
7

Mam procedurę, która wykonuje niektóre obliczenia na wszystkich rekordach zwracanych przez kursor. To wygląda trochę tak:Czy mogę przekazać wyraźny kursor do funkcji/procedury do użycia w pętli 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; 

Teraz mam sprawę gdzie trzeba wykonać dokładnie te same obliczenia na inny zestaw rekordów, które pochodzą z innej tabeli. Jednak mają one ten sam "kształt" jak w powyższym przykładzie.

Czy to możliwe, aby napisać procedurę, która wygląda tak:

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; 

wiem o SYS_REFCURSOR, ale zastanawiałem się, czy to możliwe, aby użyć znacznie wygodniejsze FOR ... LOOP składni i niejawny typu rekordu.

Odpowiedz

8

Utwórz pakiet.

Zadeklaruj kursor jako zmienną pakietu.

Użyj %rowtype, aby ustawić typ parametru funkcji.

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

Dzięki Wasilij, nie byłem pewien, PL/SQL może obsłużyć ten poziom structual pisania, ale działa jak urok! :-) –

+0

Nie ma za co) –

+0

hi @VasilyKomarov .. co jeśli instrukcja kursora ma parametr, który przekazujesz jako dane wejściowe do wszystkich funkcji i procedur w pakiecie .. jak na przykład .. kursor c wybiera 1 jako jeden, 2 jako dwa z dual, gdzie row = row_id; gdzie parametr row_id jest parametrem – thealchemist

0

Tak można użyć kursora wyraźnie do procedury i funkcji, na które trzeba zadeklarować kursor na opakowaniu jako zmiennej

Powiązane problemy