Fitur lanjutan seperti VARIADIC
atau bahkan tipe input polimorfik dan SQL dinamis sangat kuat. Bab terakhir dalam jawaban ini memberikan contoh lanjutan:
- Memfaktorkan ulang fungsi PL/pgSQL untuk mengembalikan output dari berbagai kueri SELECT
Tetapi untuk kasus sederhana seperti milik Anda, Anda cukup menggunakan nilai default untuk parameter fungsi. Itu semua tergantung pada persyaratan yang tepat.
Jika kolom yang dimaksud semuanya didefinisikan NOT NULL
, ini mungkin akan lebih sederhana dan lebih cepat:
CREATE OR REPLACE FUNCTION update_site(_name text -- always required
, _city text DEFAULT NULL
, _telephone integer DEFAULT NULL)
RETURNS integer AS
$func$
BEGIN
IF _city IS NULL AND _telephone IS NULL THEN
RAISE WARNING 'At least one value to update required!';
RETURN; -- nothing to update
END IF;
UPDATE "Sites"
SET "City" = COALESCE(_city, "City")
, "Telephone" = COALESCE(_telephone, "Telephone")
WHERE "SiteName" = _name;
END
$func$ LANGUAGE plpgsql;
Baca tentang nilai default di manual!
Untuk menghindari konflik penamaan antara parameter dan nama kolom, saya biasa menggunakan awalan parameter input dengan _
. Itu masalah selera dan gaya.
- Parameter pertama
name
tidak memiliki default, karena diperlukan setiap saat. - Parameter lain dapat dihilangkan.
- Setidaknya satu diperlukan, atau
WARNING
dibangkitkan dan tidak ada lagi yang terjadi. UPDATE
hanya akan mengubah kolom untuk parameter yang diberikan.- Dapat dengan mudah diperluas untuk N parameter.
Panggilan fungsi
Sejak Postgres 9.5 :
Cara sederhananya adalah dengan notasi posisi untuk parameter. Ini hanya memungkinkan untuk menghilangkan parameter paling kanan:
SELECT update_site('foo', 'New York'); -- no telephone
Notasi bernama memungkinkan untuk menghilangkan apa saja parameter yang memiliki nilai default:
SELECT update_site(name => 'foo', _telephone => 123); -- no city
Keduanya dapat digabungkan dalam notasi campuran :
SELECT update_site('foo', _telephone => 123); -- still no city
Di Postgres 9.4 atau lebih lama, :=
digunakan untuk tugas dalam panggilan:
SELECT update_site(name := 'foo', _telephone := 123);
SELECT update_site('foo', _telephone := 123);
Masih valid di Postgres 12 untuk kompatibilitas mundur, melainkan menggunakan notasi modern.