Lekcje modułu (2/4)
Zaawansowana logika z PL/pgSQL
Funkcje zapisane w LANGUAGE sql mogą uruchamiać tylko standardowe zapytania jedno po drugim. Jeśli potrzebowalibyśmy czegoś bardziej zaawansowanego, np. „JEŚLI wprowadzona suma jest większa niż 100, TO zastosuj zniżkę”, zwykły SQL nie jest w stanie tego zrobić samodzielnie. Musimy używać PL/pgSQL, pełnoprawnego proceduralnego języka programowania wbudowanego w Postgres.
W PL/pgSQL dodajemy klasyczne ciała utworzone z BEGIN .. END, zmiennych i instrukcji warunkowych.
CREATE OR REPLACE FUNCTION valuta_cliente(ordini INTEGER)
RETURNS TEXT AS $$
BEGIN
IF ordini > 10 THEN
RETURN 'VIP';
ELSE
RETURN 'Standard';
END IF;
END;
$$ LANGUAGE plpgsql;Ta moc pozwala nam odciążyć ogromne bloki powtarzalnej logiki, które w przeciwnym razie napisalibyśmy w JS, pakując je w bezpieczne, szybkie funkcje wykonywane blisko danych z bardzo małym opóźnieniem!
Spróbuj sam
Potrzebujemy złożonej funkcji, która zastępuje samą siebie, jeśli już istnieje („get_price_label”), akceptuje „cenę” jako NUMERYCZNĄ i zwraca szczegółowy TEKST. Użyj PL/pgSQL. Otwórz BEGIN. Zapisz logikę: jeśli cena jest > 100,00, zwróć ciąg „Premium”. W przeciwnym razie zwróć „Economico”. Zamknij warunkowy KONIEC; i ciało.
Pokaż wskazówkę
UTWÓRZ LUB ZAMIEŃ FUNKCJĘ get_price_label(cena NUMERYCZNA) ZWRACA TEKST JAKO $$ ZACZNIJ JEŻELI cena > 100,00 NASTĘPNIE ZWRÓĆ „Premium”; W przeciwnym razie ZWRÓĆ „Economico”; KONIEC JEŚLI; KONIEC; $$ JĘZYK plpgsql;
Rozwiązanie dostępne po 3 próbach
Możesz zadeklarować zmienne tymczasowe przed BEGIN za pomocą słowa kluczowego DECLARE. Napisz funkcję 'saluta_utente(userid INTEGER)' -> Zwraca TEKST, logikę PL/pgSQL. W jej wnętrzu DECLARE zmienną łańcuchową 'nome_utente TEXT;'. Następnie w BEGIN wypełnij tę zmienną imieniem, dynamicznie odpytując 'klientów' przy użyciu specjalnej klauzuli 'SELECT imię INTO nome_utente OD... GDZIE id = identyfikator użytkownika'. Na koniec RETURN łączy zmienną z „Ciao”.
Pokaż wskazówkę
Zdeklaruj nome_utente TEKST; ZACZNIJ WYBIERZ imię_W TO nome_utete... POWRÓT 'Ciao ' || nome_utente;
Rozwiązanie dostępne po 3 próbach