Tidak ada yang salah dengan fungsi plpgsql untuk sesuatu yang sedikit lebih kompleks. Satu-satunya situasi di mana kinerja dapat menurun adalah ketika fungsi plpgsql bersarang, karena perencana kueri tidak dapat lebih mengoptimalkan kode yang terkandung dalam konteks kueri luar yang mungkin atau mungkin tidak membuatnya lebih lambat.
Detail lebih lanjut dalam ini nanti jawaban:
- Perbedaan antara bahasa sql dan bahasa plpgsql pada fungsi PostgreSQL
Dalam kasus yang ada jauh lebih sederhana daripada banyak CASE
klausa dalam kueri:
CREATE OR REPLACE FUNCTION get_stuff(_param text, _orderby text, _limit int)
RETURNS SETOF stuff AS
$func$
BEGIN
RETURN QUERY EXECUTE '
SELECT *
FROM stuff
WHERE col = $1
ORDER BY ' || quote_ident(_orderby) || ' ASC
LIMIT $2'
USING _param, _limit;
END
$func$ LANGUAGE plpgsql;
Telepon:
SELECT * FROM get_stuff('hello', 'col2', 100);
Catatan
Gunakan RETURN QUERY EXECUTE
untuk mengembalikan hasil kueri sekaligus.
Gunakan quote_ident()
untuk pengidentifikasi agar terlindungi dari SQLi.
Atau format()
untuk sesuatu yang lebih kompleks. Lihat:
- Nama tabel sebagai parameter fungsi PostgreSQL
Lewati nilai parameter dengan USING
klausa untuk menghindari casting, mengutip, dan SQLi sekali lagi.
Berhati-hatilah untuk tidak membuat konflik penamaan antara parameter dan nama kolom. Saya mengawali nama parameter dengan garis bawah (_
) dalam contoh. Hanya preferensi pribadi saya.
Fungsi kedua Anda setelah pengeditan tidak dapat berfungsi, karena Anda hanya mengembalikan parent
sedangkan tipe pengembalian dideklarasikan SETOF stuff
. Anda dapat mendeklarasikan apa saja tipe pengembalian yang Anda suka, tetapi nilai pengembalian aktual harus sesuai dengan deklarasi. Anda mungkin ingin menggunakan RETURNS TABLE
untuk itu.