İnsanoğlu hala tüm bilgisayarların en alışılmadık olanıdır. Jhon F.Kennedy
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;
Kaydol:
Kayıt Yorumları (Atom)
Hiç yorum yok:
Yorum Gönder