Endless For Loop in an insert trigger - Mailing list pgsql-general

From Luis Agostinho
Subject Endless For Loop in an insert trigger
Date
Msg-id bad9b0a59fe63185e7fbfd3a83412c7540db0ceb@
Whole thread Raw
Responses Re: Endless For Loop in an insert trigger  (Richard Huxton <dev@archonet.com>)
List pgsql-general
Hello
I?m using this function to be executed within an after insert trigger, but
the part of code above wich is "painted" by blue gets in an endless loop.
I could use some help
Thanks in advance
Luis Agostinho

-----------------------,,-----------------------
CREATE FUNCTION fnc_copia_tbl_emitidos() RETURNS opaque AS ' DECLARE

    v_emitidos_trimestre RECORD;
    ano_anterior VARCHAR;
    ano_actual VARCHAR;
    ano_seguinte VARCHAR;
    cont INTEGER;
    trimestre INTEGER;
    v_ramo RECORD;
    v_emitidos_objectivos RECORD;
    v_angar RECORD;
    v_familia RECORD;
    v_realizado RECORD;
    v_r tbl_emitidos.prem_come2%TYPE;
    v_realizado_cobrado RECORD;
    v_r_c tbl_emitidos.prem_come2%TYPE;
    query_update TEXT;
    query_update_cobrados TEXT;

    BEGIN

        ano_anterior := date_part(''year'',current_date)-1;
        ano_actual := date_part(''year'',current_date);
        ano_seguinte := date_part(''year'',current_date)+1;

        SELECT INTO v_emitidos_trimestre recibo,vencimento FROM tbl_emitidos
WHERE recibo = NEW.recibo AND to_date(vencimento,''YYYY-MM-DD'') >
ano_anterior||''-12-31'';

            IF NOT FOUND THEN
                RETURN NULL;
            ELSE

                SELECT INTO trimestre EXTRACT (QUARTER FROM
to_date(v_emitidos_trimestre.vencimento,''YYYY-MM-DD''));

                           EXECUTE ''UPDATE ''
                            || '' tbl_emitidos ''
                            || '' SET ''
                            || '' trimestre ''
                            || '' = ''
                            || trimestre||ano_actual
                            || '' WHERE ''
                            || '' recibo ''
                            || '' = ''
                            || quote_literal(v_emitidos_trimestre.recibo);
            END IF;




--OBJECTIVOS

FOR v_ramo IN SELECT id,familia_objectivos FROM tbl_ramo LOOP

    FOR v_emitidos_objectivos IN SELECT recibo,ramo FROM tbl_emitidos WHERE
(familia ='''' OR familia ISNULL) AND date_part(''year'',vencimento) =
date_part(''year'',current_date) LOOP

        IF NOT FOUND THEN

            RETURN NULL;

        ELSE IF v_ramo.id = v_emitidos_objectivos.ramo THEN
            EXECUTE ''UPDATE ''
                 || '' tbl_emitidos ''
                 || '' SET ''
                 || '' familia ''
                 || '' = ''
                 || quote_literal(v_ramo.familia_objectivos)
                 || '' WHERE ''
                 || '' recibo ''
                 || '' = ''
                 || quote_literal(v_emitidos_objectivos.recibo);
               END IF;
        END IF;
    END LOOP;
END LOOP;


FOR v_angar IN SELECT DISTINCT angar FROM tbl_login LOOP

    FOR v_familia IN SELECT id FROM tbl_familia_objectivos LOOP

            v_r = 0;

            FOR v_realizado IN SELECT recibo,prem_come2 FROM tbl_emitidos WHERE
angar = v_angar.angar AND familia = v_familia.id AND tipo = 5 AND (estado
!=2 OR estado !=3 OR estado !=4 OR estado !=5 OR estado !=6 OR estado !=7
OR estado !=8) LOOP

                IF NOT FOUND THEN
                    RETURN NULL;

                ELSE
                    v_r = v_r + v_realizado.prem_come2;

                END IF;

            END LOOP;

            IF v_r <> 0 THEN

               EXECUTE '' UPDATE ''
                     || '' tbl_objectivos ''
                     || '' SET ''
                     || '' valor_realizado ''
                     || '' = ''
                     || v_r
                     || '' WHERE ''
                     || '' balcao ''
                     || '' = ''
                     || quote_literal(v_angar.angar)
                     || '' AND ''
                     || '' familia ''
                     || '' = ''
                     || quote_literal(v_familia.id);
            RAISE NOTICE ''VAI RETORNAR EXIT'';

            END IF;

    END LOOP;
END LOOP;

RETURN NULL;


END;
'  LANGUAGE 'plpgsql';



pgsql-general by date:

Previous
From: John Sidney-Woollett
Date:
Subject: Re: langauges, locales, regex, LIKE
Next
From: Hunter Hillegas
Date:
Subject: Possible To Modify Part of String in Certain Rows?