Konstrukcje sterujące to podstawa każdego programu, czy to SQL-script, Python-code, czy nawet robot na Marsie, który się zastanawia, czy wysłać sygnał do domu, czy poszukać życia za rogiem krateru.
W PL/pgSQL konstrukcje sterujące pomagają nam:
- Wykonywać konkretne akcje, jeśli warunki są spełnione.
- Kontrolować kolejność wykonywania kodu.
- Realizować logikę podejmowania decyzji.
Możesz je sobie wyobrazić jak znaki drogowe: "Jeśli widzisz STOP, zatrzymaj się. Jeśli widzisz zielone światło — jedź!"
Najpopularniejsze konstrukcje sterujące w PL/pgSQL:
IF– sprawdza warunek i wykonuje odpowiednie polecenia.CASE– alternatywa dlaIF, kiedy warunków jest dużo.RETURN– kończy działanie funkcji i zwraca wynik.
Już coś o nich wiesz. No i po innych językach programowania ogarniesz je bez problemu.
Operator warunkowy IF
Operator IF używamy, żeby wykonać kod tylko wtedy, gdy jakiś warunek jest TRUE (prawda). Oto jego podstawowa struktura:
IF warunek THEN
-- Kod, który się wykona, jeśli warunek jest prawdziwy.
ELSE
-- Alternatywny kod, jeśli warunek jest fałszywy.
END IF;
Napiszemy funkcję, która przyjmuje liczbę i zwraca, czy jest parzysta czy nieparzysta:
CREATE OR REPLACE FUNCTION check_even_odd(num INTEGER)
RETURNS TEXT AS $$
BEGIN
IF num % 2 = 0 THEN
RETURN 'Liczba parzysta';
ELSE
RETURN 'Liczba nieparzysta';
END IF;
END;
$$ LANGUAGE plpgsql;
Teraz ją przetestujemy:
SELECT check_even_odd(4); -- Liczba parzysta
SELECT check_even_odd(7); -- Liczba nieparzysta
Krótkie wyjaśnienie: IF num % 2 = 0 THEN sprawdza, czy liczba dzieli się przez 2 bez reszty.
Warunek ELSIF
Czasem jedna kontrola nie wystarczy i trzeba sprawdzić kilka warunków. Do tego jest ELSIF.
Załóżmy, że mamy funkcję, która zwraca tekstowy komentarz o temperaturze:
CREATE OR REPLACE FUNCTION temperature_comment(temp INTEGER)
RETURNS TEXT AS $$
BEGIN
IF temp < 0 THEN
RETURN 'Bardzo zimno!';
ELSIF temp >= 0 AND temp <= 20 THEN
RETURN 'Chłodno';
ELSE
RETURN 'Ciepło!';
END IF;
END;
$$ LANGUAGE plpgsql;
Testujemy:
SELECT temperature_comment(-5); -- Bardzo zimno!
SELECT temperature_comment(15); -- Chłodno
SELECT temperature_comment(25); -- Ciepło!
Składnia CASE
Jeśli masz dużo warunków, operator CASE ratuje życie. Trochę przypomina IF, ale jest bardziej "elegancki".
CASE
WHEN warunek_1 THEN wartosc_1
WHEN warunek_2 THEN wartosc_2
ELSE wartosc_domyslna
END;
Stwórzmy funkcję, która zwraca tekstową ocenę na podstawie liczby:
CREATE OR REPLACE FUNCTION grade_comment(score INTEGER)
RETURNS TEXT AS $$
BEGIN
RETURN CASE
WHEN score >= 90 THEN 'Celująco'
WHEN score >= 75 THEN 'Dobrze'
WHEN score >= 50 THEN 'Dostatecznie'
ELSE 'Niedostatecznie'
END;
END;
$$ LANGUAGE plpgsql;
Testujemy:
SELECT grade_comment(95); -- Celująco
SELECT grade_comment(80); -- Dobrze
SELECT grade_comment(45); -- Niedostatecznie
Uwaga: w przeciwieństwie do IF, CASE zwraca wartość, więc operator RETURN można użyć bezpośrednio w CASE.
Operator RETURN
RETURN kończy działanie funkcji i zwraca wartość. To mega ważne w funkcjach PL/pgSQL, które muszą coś zwracać (np. tekst, liczbę itd.).
Zobaczmy, jak działa RETURN na prostym przykładzie:
CREATE OR REPLACE FUNCTION return_example()
RETURNS TEXT AS $$
BEGIN
RETURN 'Hello, World!';
END;
$$ LANGUAGE plpgsql;
Wynik:
SELECT return_example(); -- Hello, World!
A co jeśli mamy kilka ścieżek kodu? Na przykład sprawdzanie danych wejściowych. Wtedy RETURN pojawi się w różnych miejscach funkcji:
CREATE OR REPLACE FUNCTION check_positive_negative(num INTEGER)
RETURNS TEXT AS $$
BEGIN
IF num > 0 THEN
RETURN 'Liczba dodatnia';
ELSIF num = 0 THEN
RETURN 'Zero';
ELSE
RETURN 'Liczba ujemna';
END IF;
END;
$$ LANGUAGE plpgsql;
Testujemy:
SELECT check_positive_negative(10); -- Liczba dodatnia
SELECT check_positive_negative(0); -- Zero
SELECT check_positive_negative(-5); -- Liczba ujemna
Typowe błędy i gdzie można się pogubić
- Pominięcie operatora
END: zapomniszEND CASE;alboEND IF;i PostgreSQL od razu przypomni ci, że trzeba zamknąć blok kodu. - Błędy logiczne przy użyciu
ELSIF: kolejność warunków jest ważna! Bardziej ogólny warunek (temp > 0) nie powinien być przed bardziej szczegółowym (temp > 20). - Zapomniałeś o
RETURN: w PL/pgSQL funkcja musi coś zwracać, jeśli zadeklarowałeśRETURNS.
To wszystko na dziś. Omówiliśmy podstawy konstrukcji sterujących i logiki w PL/pgSQL. Ta wiedza przyda ci się w praktyce przy tworzeniu bardziej zaawansowanych funkcji! Następnym razem ogarniemy pętle i ich użycie.
GO TO FULL VERSION