İdarəedici konstruksiyalar — istənilən proqramın əsas hissəsidir, fərqi yoxdur SQL script, Python kodu və ya Marsda olan robot olsun, hansı ki, düşünür: evə siqnal göndərsin, ya da kraterin küncündə həyat axtarsın.
PL/pgSQL-də idarəedici konstruksiyalar bizə kömək edir:
- Əgər şərt doğrudursa, müəyyən əməliyyatları yerinə yetirmək.
- Kodun icra ardıcıllığını idarə etmək.
- Qərar qəbul etmə məntiqini qurmaq.
Bunları yolda olan yol nişanları kimi təsəvvür edə bilərsən: "Əgər STOP görürsənsə, dayan. Əgər yaşıl işıqdırsa — hərəkət et!"
PL/pgSQL-də ən məşhur idarəedici konstruksiyalar:
IF– şərti yoxlayır və uyğun əmrləri icra edir.CASE– çoxlu şərt olandaIF-ə alternativdir.RETURN– funksiyanın icrasını bitirir və nəticəni qaytarır.
Artıq bunlar barədə təsəvvürün var. Proqramlaşdırma dillərindən sonra bunları başa düşmək lap asan olacaq.
IF şərt operatoru
IF operatoru kodu yalnız müəyyən şərt TRUE (doğrudur) olduqda icra etmək üçün istifadə olunur. Onun əsas strukturu belədir:
IF şərt THEN
-- Şərt doğrudursa icra olunan kod.
ELSE
-- Əks halda icra olunan alternativ kod.
END IF;
Bir funksiya yazaq, hansı ki, bir ədəd qəbul edir və onun cüt ya tək olduğunu qaytarır:
CREATE OR REPLACE FUNCTION check_even_odd(num INTEGER)
RETURNS TEXT AS $$
BEGIN
IF num % 2 = 0 THEN
RETURN 'Ədəd cütdür';
ELSE
RETURN 'Ədəd təkdir';
END IF;
END;
$$ LANGUAGE plpgsql;
İndi bunu test edək:
SELECT check_even_odd(4); -- Ədəd cütdür
SELECT check_even_odd(7); -- Ədəd təkdir
Qısa izah: IF num % 2 = 0 THEN yoxlayır ki, ədəd 2-yə qalıqsız bölünürmü.
ELSIF şərti
Bəzən bir yoxlama kifayət etmir və bir neçə şərti yoxlamaq lazımdır. Bunun üçün ELSIF var.
Tutaq ki, bizdə temperatur haqqında mətn mesajı qaytaran funksiya var:
CREATE OR REPLACE FUNCTION temperature_comment(temp INTEGER)
RETURNS TEXT AS $$
BEGIN
IF temp < 0 THEN
RETURN 'Çox soyuqdur!';
ELSIF temp >= 0 AND temp <= 20 THEN
RETURN 'Sərin';
ELSE
RETURN 'İstidır!';
END IF;
END;
$$ LANGUAGE plpgsql;
Test edirik:
SELECT temperature_comment(-5); -- Çox soyuqdur!
SELECT temperature_comment(15); -- Sərin
SELECT temperature_comment(25); -- İstidır!
CASE sintaksisi
Əgər çoxlu şərtin varsa, CASE operatoru səni xilas edəcək. O, bir az IF-ə oxşayır, amma daha "elegantdır".
CASE
WHEN şərt_1 THEN dəyər_1
WHEN şərt_2 THEN dəyər_2
ELSE default_dəyər
END;
Bir funksiya yaradaq, hansı ki, ədədə əsasən mətn qiymətləndirməsi qaytarır:
CREATE OR REPLACE FUNCTION grade_comment(score INTEGER)
RETURNS TEXT AS $$
BEGIN
RETURN CASE
WHEN score >= 90 THEN 'Əla'
WHEN score >= 75 THEN 'Yaxşı'
WHEN score >= 50 THEN 'Qənaətbəxş'
ELSE 'Qeyri-qənaətbəxş'
END;
END;
$$ LANGUAGE plpgsql;
Test edirik:
SELECT grade_comment(95); -- Əla
SELECT grade_comment(80); -- Yaxşı
SELECT grade_comment(45); -- Qeyri-qənaətbəxş
Qeyd: IF-dən fərqli olaraq, CASE dəyər qaytarır, ona görə də RETURN operatorunu birbaşa CASE içində istifadə etmək olar.
RETURN operatoru
RETURN funksiyanın icrasını bitirir və dəyəri qaytarır. Bu, PL/pgSQL-də funksiyalar üçün kritikdir, çünki onlar mütləq nəsə qaytarmalıdır (məsələn, mətn, ədəd və s.).
Gəlin, RETURN-un necə işlədiyinə ən sadə nümunədə baxaq:
CREATE OR REPLACE FUNCTION return_example()
RETURNS TEXT AS $$
BEGIN
RETURN 'Salam, Dünya!';
END;
$$ LANGUAGE plpgsql;
Nəticə:
SELECT return_example(); -- Salam, Dünya!
Bəs birdən bir neçə kod budağımız olsa? Məsələn, daxil olan verilənləri yoxlamaq. Onda RETURN funksiyanın müxtəlif yerlərində istifadə olunacaq:
CREATE OR REPLACE FUNCTION check_positive_negative(num INTEGER)
RETURNS TEXT AS $$
BEGIN
IF num > 0 THEN
RETURN 'Müsbət ədəd';
ELSIF num = 0 THEN
RETURN 'Sıfır';
ELSE
RETURN 'Mənfi ədəd';
END IF;
END;
$$ LANGUAGE plpgsql;
Test edirik:
SELECT check_positive_negative(10); -- Müsbət ədəd
SELECT check_positive_negative(0); -- Sıfır
SELECT check_positive_negative(-5); -- Mənfi ədəd
Tipik səhvlər və harada çaşmaq olar
ENDoperatorunu unutmaq:END CASE;və yaEND IF;yazmağı unutsan, PostgreSQL dərhal kod blokunu bitirməyi tələb edəcək.ELSIFistifadə edərkən məntiqi səhvlər: şərtlərin ardıcıllığı vacibdir! Daha ümumi şərt (temp > 0) daha spesifik şərtdən (temp > 20) əvvəl gəlməməlidir.RETURN-u unutmaq: PL/pgSQL-də funksiya mütləq nəsə qaytarmalıdır, əgərRETURNSelan etmisənsə.
Bu qədər. Biz PL/pgSQL-də idarəedici konstruksiyaların və məntiqin əsaslarını öyrəndik. Bu biliklər sənə daha mürəkkəb funksiyalar yazanda lazım olacaq! Növbəti dəfə dövrlər və onların istifadəsinə baxacağıq.
GO TO FULL VERSION