2012-05-17 15 views
7

Tengo un procedimiento que realiza algunos cálculos en todos los registros devueltos por un cursor. Se ve un poco como esto:¿Puedo pasar un cursor explícito a una función/procedimiento para usar en el 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; 

ahora tengo el caso en el que necesito para llevar a cabo el mismo cálculo exacto sobre un conjunto diferente de registros que provienen de una tabla diferente. Sin embargo, estos tienen la misma "forma" que en el ejemplo anterior.

¿Es posible escribir un procedimiento que tiene este aspecto:

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; 

que sé sobre SYS_REFCURSOR, pero me preguntaba si era posible utilizar el mucho más conveniente FOR ... LOOP sintaxis y la implícita tipo de registro.

Respuesta

8

Crea un paquete.

Declare el cursor como variable del paquete.

Utilice %rowtype para establecer el tipo de parámetro de función.

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

Gracias Vasily, no estaba segura de PL/SQL podría manejar ese nivel de mecanografía structual, pero funciona como un encanto! :-) –

+0

Sea bienvenido) –

+0

hi @VasilyKomarov .. ¿Qué pasa si la instrucción cursor tiene un parámetro que pasa como entrada a todas las funciones y procedimientos en el paquete ... como por ejemplo ... cursor c es seleccionar 1 como uno, 2 como dos desde dual donde row = row_id; donde row_id es el parámetro – thealchemist

0

Sí, puedes usar el cursor de forma explícita en el procedimiento y función, para que el cursor tiene que declarar en el paquete tan variables

Cuestiones relacionadas