Pelajaran modul (2/4)
Logika tingkat lanjut dengan PL/pgSQL
Fungsi yang ditulis dalam LANGUAGE sql hanya dapat menjalankan kueri standar satu demi satu. Jika kita membutuhkan sesuatu yang lebih canggih seperti "JIKA total yang dimasukkan lebih besar dari 100 MAKA terapkan diskon", SQL biasa tidak dapat melakukannya sendiri. Kita perlu menggunakan PL/pgSQL, bahasa pemrograman prosedural lengkap yang dibangun di Postgres.
Di PL/pgSQL kami menambahkan badan klasik yang terbuat dari BEGIN .. END, variabel, dan pernyataan kondisional.
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;Kekuatan ini memungkinkan kita membongkar blok-blok besar logika berulang yang seharusnya kita tulis di JS, mengemasnya ke dalam fungsi-fungsi yang aman dan cepat yang dieksekusi dekat dengan data dengan latensi sangat rendah!
Cobalah sendiri
Kami menginginkan fungsi kompleks yang menggantikan dirinya sendiri jika sudah ada ('get_price_label'), menerima 'price' sebagai NUMERIC, dan mengembalikan TEKS verbose.\nGunakan PL/pgSQL. Buka BEGIN.\nTulis logikanya: jika harga > 100,00 kembalikan string 'Premium'. ELSE kembalikan 'Economico'.\nTutup kondisional END; dan tubuh.
Tunjukkan petunjuk
BUAT ATAU GANTI FUNGSI get_price_label(price NUMERIC) MENGEMBALIKAN TEKS SEBAGAI $$ MULAI JIKA harga > 100,00 MAKA KEMBALI 'Premium'; LAINNYA KEMBALI 'Economico'; AKHIR JIKA; AKHIR; $$ BAHASA plpgsql;
Solusi tersedia setelah 3 upaya
Anda dapat mendeklarasikan variabel sementara sebelum BEGIN dengan kata kunci DECLARE.\nTulis fungsi 'saluta_utente(userid INTEGER)' -> Mengembalikan logika TEXT, PL/pgSQL.\nDi dalamnya DECLARE variabel string 'nome_utente TEXT;'.\nKemudian, di dalam BEGIN, isi variabel tersebut dengan first_name dengan menanyakan 'pelanggan' secara dinamis menggunakan klausa khusus 'SELECT first_name INTO nome_utente DARI... DIMANA id = userid'. Terakhir, RETURN menggabungkan variabel menjadi 'Ciao'.
Tunjukkan petunjuk
MENYATAKAN TEKS nome_utente; \nMULAI PILIH nama_depan KE nome_utente... \nKEMBALI 'Ciao ' || nama_utente;
Solusi tersedia setelah 3 upaya