2016-05-16 11 views
0

私はあなたの助けが必要です。私はpostgresqlでiterator porcessを1つ作成しようとしますが、できません。私はこれがあります。イテレータpostgreslql

-- Function: public.actualizar_luminarias() 

-- DROP FUNCTION public.actualizar_luminarias(); 

CREATE OR REPLACE FUNCTION public.actualizar_luminarias() 
    RETURNS trigger AS 
$BODY$ 

BEGIN 

    IF (TG_OP = 'DELETE') THEN 
     DELETE FROM "Luminarias" where id_pluz=OLD.id_pluz; 
     RETURN OLD; 

    ELSIF (TG_OP = 'UPDATE') THEN 
     UPDATE "Luminarias" set id_pluz=NEW.id_pluz, geom=NEW.geom, centromand=NEW.centromand where id_pluz=OLD.id_pluz; 
     RETURN NEW; 

    ELSIF (TG_OP = 'INSERT') THEN 
    IF (NEW.numluminar = 1) THEN 
     INSERT INTO "Luminarias"(id_pluz, geom, centromand) VALUES (NEW.id_pluz, NEW.geom, NEW.centromand); 
     RETURN NEW; 
    ELSIF (NEW.numluminar = 2) THEN 
     INSERT INTO "Luminarias"(id_pluz, geom, centromand) VALUES (NEW.id_pluz, NEW.geom, NEW.centromand); 
     INSERT INTO "Luminarias"(id_pluz, geom, centromand) VALUES (NEW.id_pluz, NEW.geom, NEW.centromand); 
     RETURN NEW; 
    ELSIF (NEW.numluminar = 3) THEN 
     INSERT INTO "Luminarias"(id_pluz, geom, centromand) VALUES (NEW.id_pluz, NEW.geom, NEW.centromand); 
     INSERT INTO "Luminarias"(id_pluz, geom, centromand) VALUES (NEW.id_pluz, NEW.geom, NEW.centromand); 
     INSERT INTO "Luminarias"(id_pluz, geom, centromand) VALUES (NEW.id_pluz, NEW.geom, NEW.centromand); 
     RETURN NEW; 
    ELSIF (NEW.numluminar > 3) THEN 
     INSERT INTO "Luminarias"(id_pluz, geom, centromand) VALUES (NEW.id_pluz, NEW.geom, NEW.centromand); 
     RETURN NEW; 
    END IF; 
    END IF; 
    RETURN NULL; 

END; 

$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION public.actualizar_luminarias() 
    OWNER TO postgres; 
COMMENT ON FUNCTION public.actualizar_luminarias() IS 'Actualiza las luminarias automaticamente cuando se modifica puntos de luz'; 

をし、私はこのようなFORまたはWHILEイテレータを使用して実装このコードを試してみてください。

... 

    ELSIF (TG_OP = 'INSERT') THEN 
    WHILE iterator <= NEW.numluminar 
    LOOP 
     INSERT INTO "Luminarias"(id_pluz, geom, centromand) VALUES (NEW.id_pluz, NEW.geom, NEW.centromand); 
     RETURN NEW; 
     iterator := iterator + 1; 
    END LOOP; 
    RETURN NULL; 

END; 

... 

またはこの:

... 
ELSIF (TG_OP = 'INSERT') THEN 
    FOR i in 1...NEW.lumnuminar 
    LOOP 
     INSERT INTO "Luminarias"(id_pluz, geom, centromand) VALUES (NEW.id_pluz, NEW.geom, NEW.centromand); 
     RETURN NEW; 
    END LOOP; 
    RETURN NULL; 

END; 

誰かが1つのイテレータを実装することができます方法を知っていますお願いします? ご協力いただきありがとうございます!

+0

ループ内部からは戻ってはいけません。 RETURNは関数を終了します。 –

+0

ありがとう!それは今働いている – Daviiidet

答えて

0

ありがとうジムナービー!

WHILE iterator <= NEW.numluminar 
     LOOP 
     INSERT INTO "Luminarias"(id_pluz, geom, centromand) VALUES (NEW.id_pluz, NEW.geom, NEW.centromand); 
     iterator := iterator + 1; 
     END LOOP; 
    RETURN NEW;