Modül dersleri (2/4)
PL/pgSQL ile gelişmiş mantık
LANGUAGE sql ile yazılan işlevler yalnızca standart sorguları arka arkaya çalıştırabilir. "Girilen toplam 100'den büyükse O ZAMAN indirim uygulayın" gibi daha gelişmiş bir şeye ihtiyacımız varsa, basit SQL bunu kendi başına yapamaz. Postgres'te yerleşik, tam teşekküllü bir prosedür programlama dili olan PL/pgSQL kullanmamız gerekiyor.
PL/pgSQL'de BEGIN .. END, değişkenler ve koşullu ifadelerden oluşan klasik gövdeleri ekliyoruz.
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;Bu güç, normalde JS'de yazacağımız devasa tekrarlayan mantık bloklarını boşaltmamıza olanak tanır ve bunları verilere yakın olarak çok düşük gecikmeyle yürütülen güvenli, hızlı işlevlere paketler!
Kendin dene
Zaten mevcutsa kendisini değiştiren ('get_price_label'), 'fiyat'ı NUMERIC olarak kabul eden ve ayrıntılı bir TEXT döndüren karmaşık bir işlev istiyoruz.\nPL/pgSQL kullanın. BEGIN'i açın.\nMantığı yazın: fiyat > 100,00 ise 'Premium' dizesini döndürün. ELSE 'Economico'yu döndürür.\nKoşullu END'i kapatın; ve vücut.
İpucu göster
FONKSİYONU OLUŞTURUN VEYA DEĞİŞTİRİN get_price_label(price SAYISAL) METNİ $$ OLARAK DÖNÜR, EĞER fiyat > 100,00 İSE 'Premium'u DÖNÜN; YOKSA 'Economico'ya DÖNÜŞ; EĞER SON; SON; $$ DİL plpgsql;
3 denemeden sonra çözüm mevcut
DECLARE anahtar sözcüğüyle BEGIN'den önce geçici değişkenler bildirebilirsiniz.\nBir 'saluta_utente(userid INTEGER)' işlevi yazın -> TEXT, PL/pgSQL mantığını döndürür.\nİçinde 'nome_utente TEXT;' dize değişkenini DECLARE yapın.\nSonra, BEGIN'in içinde, 'SELECT name_name INTO' özel yan tümcesini kullanarak 'müşterileri' dinamik olarak sorgulayarak bu değişkeni ilk_adla doldurun nome_utente FROM... NEREDE kimliği = kullanıcı kimliği'. Son olarak RETURN, değişkeni 'Ciao' ile birleştirir.
İpucu göster
nome_utente METİNİ BEYAN EDİN; \nBEGIN name_utente INTO name_name SEÇİN... \nRETURN 'Ciao ' || nome_utente;
3 denemeden sonra çözüm mevcut