19 Ekim 2016 Çarşamba

PostgreSql'de Döngüler


PostgreSql'de IF - ELSIF - END İçinde FOR Döngüsü Kullanımı:


- PostgreSql veritabanı sorgulamalarında extradan herhangi bir yazılım platformu veya arayüzü kullanımına gerek kalmaksızın sorguları bir değişkene bağlayabilir, değişkenleri bir döngü içerisinde kullanarak istediğimiz değeri döndürecek fonksiyonlar yaratabiliriz. Bu fonksiyonlar, postgres'de bir defalığına derlendiğinden başka yazılım arayüzünden kullanmak üzere bu fonksiyonlara erişim yaptığımızda geliştirdiğimiz uygulamalar çok daha hızlı çalışacaktır. Aşağıdaki örnekte fonksinsert fonksiyonu tanımlanan koşullara bağlı olarak insert ve update işlemleri yapmaktadır.


CREATE OR REPLACE FUNCTION fonksinsert()
  RETURNS trigger AS
$BODY$

DECLARE a INTEGER; -- değişken tanımlama
DECLARE b INTEGER;
DECLARE c INTEGER;
DECLARE d INTEGER;

BEGIN
 --sql sorgulardan dönen sonuçların değişkenlere atanması
a:=(SELECT nrperiod from STSCMETRICTARGET where cdscmetric=8460 order by nryear,nrperiod desc limit 1);
b:=(SELECT nrperiod from STSCMETRICTARGET where cdscmetric=8462 order by nryear,nrperiod desc limit 1);
c:=(SELECT nrperiod from STSCMETRICTARGET where cdscmetric=8462 order by nryear desc limit 1);
d:=(SELECT count(nrperiod) from STSCMETRICTARGET where cdscmetric=8462 AND nrperiod is not null);


IF (a+1 > b) AND (c <> 1) AND (a+1 > d) THEN --- koşul 1
    IF (a+1 < 13) THEN --koşul 2

FOR b IN b..a LOOP  -- FOR -- IN 1..x LOOP döngüsü: örnekte b değişkenine bağlı olarak b'nin değerinden başlamak üzere a'nin değerine olan sayı farkı kadar döngü döner. Döngünün her dönüşünde aşağıdaki INSERT cümleciği işlenmektedir.

 INSERT INTO STSCMETRICTARGET (cdscmetrictarget,CDSCMETRIC,NRPERIOD, NRYEAR, VLWEIGHT, VLACTUAL) SELECT DISTINCT
(select cdscmetrictarget+1 from stscmetrictarget order by cdscmetrictarget desc limit 1) as cdscmetrictarget,
(select 8462 from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as CDSCMETRIC,
(select NRPERIOD +1 from stscmetrictarget where cdscmetric=8462 order by NRYEAR,NRPERIOD DESC LIMIT 1) as NRPERIOD,
(select NRYEAR from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as NRYEAR,
(select VLWEIGHT from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as VLWEIGHT,
(select VLACTUAL from stscmetrictarget where cdscmetric=8460 AND nrperiod=b) as VLACTUAL
 FROM STSCMETRICTARGET where cdscmetric=8460 limit 1;

END LOOP; --- FOR döngü sonu
RETURN NULL;

    ELSE

INSERT INTO STSCMETRICTARGET (cdscmetrictarget,CDSCMETRIC,NRPERIOD, NRYEAR, VLWEIGHT, VLACTUAL) SELECT DISTINCT
(select cdscmetrictarget+1 from stscmetrictarget order by cdscmetrictarget desc limit 1) as cdscmetrictarget,
(select 8462 from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as CDSCMETRIC,
(1) as NRPERIOD,
(select NRYEAR+1 from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as NRYEAR,
(select VLWEIGHT from stscmetrictarget where cdscmetric=8460 order by NRYEAR,NRPERIOD DESC LIMIT 1) as VLWEIGHT,
(select VLACTUAL from stscmetrictarget where cdscmetric=8460 AND nrperiod=b) as VLACTUAL
 FROM STSCMETRICTARGET where cdscmetric=8462 limit 1;

RETURN NULL;

    END IF;

ELSIF (a+1 = b) THEN

    IF (a+1 < 13) THEN

  UPDATE STSCMETRICTARGET SET VLACTUAL=AD.DVD FROM ((select CDSCMETRIC AS DV,NRPERIOD AS DVP,NRYEAR AS DVY, VLACTUAL AS DVD from STSCMETRICTARGET where cdscmetric=8460) A JOIN
 (select CDSCMETRIC AS DA,NRPERIOD AS DAP,NRYEAR AS DAAY, VLACTUAL AS DAD from STSCMETRICTARGET where cdscmetric=8462) B ON DAAY=DVY AND DVP+1=DAP) AD
  WHERE cdscmetric=8462 AND NRPERIOD=DVP+1 AND NRYEAR=DVY;

   RETURN NULL;
   EXIT;

    ELSE

   UPDATE STSCMETRICTARGET SET VLACTUAL=AD.DVD FROM ((select CDSCMETRIC AS DV,NRPERIOD AS DVP,NRYEAR AS DVY, VLACTUAL AS DVD from STSCMETRICTARGET where cdscmetric=8460) A JOIN
 (select CDSCMETRIC AS DA,NRPERIOD AS DAP,NRYEAR AS DAAY, VLACTUAL AS DAD from STSCMETRICTARGET where cdscmetric=8462) B ON DAAY+1=DVY AND DAP=1) AD
  WHERE cdscmetric=8462 AND NRPERIOD=1 AND NRYEAR=NRYEAR+1;
  RETURN NULL;
  EXIT;

   END IF;

ELSE

 UPDATE STSCMETRICTARGET SET VLACTUAL=AD.DVD FROM ((select CDSCMETRIC AS DV,NRPERIOD AS DVP,NRYEAR AS DVY, VLACTUAL AS DVD from STSCMETRICTARGET where cdscmetric=8460) A JOIN
 (select CDSCMETRIC AS DA,NRPERIOD AS DAP,NRYEAR AS DAAY, VLACTUAL AS DAD from STSCMETRICTARGET where cdscmetric=8462) B ON DAAY+1=DVY AND DAP=1) AD
  WHERE cdscmetric=8462 AND NRPERIOD=1 AND NRYEAR=NRYEAR+1;
RETURN NULL;

EXIT;
END IF;
END
$BODY$
  LANGUAGE plpgsql VOLATILE;

Hiç yorum yok:

Yorum Gönder