hola a todos

tengo el siguiente procedimiento almacenado

create or replace function sp_insert_buquesPoliticaSalarial(p_perspective_id    
   bigint,
                                                            p_buque_clave       
   bigint,
                                                            p_pt_clave          
   bigint,
                                                            p_deb_basicos_clave 
   bigint [],
                                                            p_deb_comp_clave    
   bigint [],
                                                            
p_acum_variables_clave bigint [],
                                                            
p_tarifas_varias_clave bigint [],
                                                            p_lsi_clave         
   bigint [],
                                                            p_user_creator      
   text)
    returns integer as
    $$
    declare
        rows_affected integer := 0;
    begin
-- insertando debengos básicos
        for i in 1..array_length(p_deb_basicos_clave, 1) loop
            insert into co0060ca01scae (
                fk503_co0030ca02scaa_clave,
                fk474_co0010ca01scaa_clave,
                fk639_co0040ca02scaa_clave,
                perspective_id,
                user_creator)
            values
                (p_deb_basicos_clave [i], p_buque_clave, p_pt_clave, 
p_perspective_id, p_user_creator);
            rows_affected := rows_affected + 1;
        end loop;

-- insertando debengos complementarios
        for i in 1..array_length(p_deb_comp_clave, 1) loop
            insert into co0060ca01scaf (
                fk543_co0030ca02scab_clave,
                fk474_co0010ca01scaa_clave,
                fk639_co0040ca02scaa_clave,
                perspective_id,
                user_creator)
            values (p_deb_comp_clave [i], p_buque_clave, p_pt_clave, 
p_perspective_id, p_user_creator);
            rows_affected := rows_affected + 1;
        end loop;

-- insertando tarifas varias
        for i in 1..array_length(p_tarifas_varias_clave, 1) loop
            insert into co0060ca01scaj (
                fk514_co0030ca02scac_clave,
                fk639_co0040ca02scaa_clave,
                fk474_co0010ca01scaa_clave,
                perspective_id,
                user_creator)
            values (p_tarifas_varias_clave [i], p_pt_clave, p_buque_clave, 
p_perspective_id, p_user_creator);
            rows_affected := rows_affected + 1;
        end loop;
-- insertando acumulaciones variables
        for i in 1..array_length(p_acum_variables_clave, 1) loop
            insert into co0060ca01scam (
                fk1338_co0030ca04scad_clave,
                fk639_co0040ca02scaa_clave,
                fk474_co0010ca01scaa_clave, perspective_id,
                user_creator)
            values (p_acum_variables_clave [i], p_pt_clave, p_buque_clave, 
p_perspective_id, p_user_creator);
            rows_affected := rows_affected + 1;
        end loop;

-- insertando LSI
        for i in 1..array_length(p_lsi_clave, 1) loop
            insert into co0060ca01scal (
                fk525_co0030ca02scae_clave,
                fk639_co0040ca02scaa_clave,
                fk474_co0010ca01scaa_clave,
                perspective_id,
                user_creator)
            values (p_lsi_clave, p_pt_clave, p_buque_clave, p_perspective_id, 
p_user_creator);
            rows_affected := rows_affected + 1;
        end loop;

        exception when raise_exception
        then
            begin
                rows_affected := 0;
                rollback ;
            end;

        return rows_affected
    end;
    $$
language plpgsql;
el problema es que al final necesito capturar si hubo algún error en cualquiera 
de los insert que estoy haciendo dentro de los cilos, en caso tal de haber al 
menos 1 error, necesito hacer rollback para que si en los cilos anteriores se 
insertó algo poner todo en el estado anterior…

pienso que con excepciones puedo determinar cuando hubo un error, el tema es 
que no sé qué tipo de escepción poner para el caso general, porque no sé en 
Postgres cómo puedo capturar más de una excepción.

mi proc almacenado es el anterior, pero no sé si está correcto para lo que 
quiero hacer con las excepciones ni si es la mejor forma de hacerlo

algun criterio por favor ???

saludos cordiales


=============================================
"El tamaño de tus logros depende del tamaño de tus metas." 
C++ and Qt Senior Developer
Lic. Computer Science
Buenos Aires, Argentina

Responder a