0Pricing
SQL Academy · Pelajaran

Dasar-Dasar Fungsi PL/pgSQL

Tulis fungsi PL/pgSQL dengan parameter, RETURNS TABLE, alur kendali (IF, LOOP, FOREACH), dan penanganan pengecualian

Dasar-Dasar Fungsi PL/pgSQL adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.

Apa Itu PL/pgSQL?

Bahasa prosedural bawaan PostgreSQL. SQL yang diperluas dengan variabel, alur kendali, pengecualian, dan kemampuan untuk memanggil query secara dinamis. Digunakan untuk prosedur tersimpan dan fungsi pemicu.

Kerangka Fungsi

Fungsi sederhana:

CREATE OR REPLACE FUNCTION add(a INT, b INT)
RETURNS INT AS $$
BEGIN
  RETURN a + b;
END;
$$ LANGUAGE plpgsql IMMUTABLE;

SELECT add(2, 3);   -- 5

Variabel

Deklarasikan dengan DECLARE; tetapkan nilainya dengan := atau INTO:

CREATE FUNCTION user_orders(uid BIGINT)
RETURNS INT AS $$
DECLARE
  cnt INT;
BEGIN
  SELECT COUNT(*) INTO cnt FROM orders WHERE user_id = uid;
  RETURN cnt;
END;
$$ LANGUAGE plpgsql STABLE;

Alur Kendali

IF / ELSE, FOR, WHILE, CASE:

IF cnt = 0 THEN
  RAISE NOTICE 'no orders';
ELSIF cnt < 10 THEN
  RAISE NOTICE 'few';
ELSE
  RAISE NOTICE 'many';
END IF;

FOR i IN 1..10 LOOP
  RAISE NOTICE '%', i;
END LOOP;

Melakukan Perulangan pada Hasil Query

Iterasi bergaya kursor:

CREATE FUNCTION recalc_totals() RETURNS VOID AS $$
DECLARE
  r RECORD;
BEGIN
  FOR r IN SELECT id FROM users LOOP
    UPDATE users SET
      order_count = (SELECT COUNT(*) FROM orders WHERE user_id = r.id)
    WHERE id = r.id;
  END LOOP;
END;
$$ LANGUAGE plpgsql;

RETURNS TABLE

Kembalikan sekumpulan hasil:

CREATE FUNCTION top_buyers(n INT)
RETURNS TABLE (user_id BIGINT, total NUMERIC) AS $$
BEGIN
  RETURN QUERY
    SELECT o.user_id, SUM(o.total)
    FROM orders o
    GROUP BY o.user_id
    ORDER BY SUM(o.total) DESC
    LIMIT n;
END;
$$ LANGUAGE plpgsql STABLE;

SELECT * FROM top_buyers(10);

Parameter IN / OUT / INOUT

Beberapa nilai kembalian:

CREATE FUNCTION stats(uid BIGINT,
  OUT total NUMERIC,
  OUT cnt INT) AS $$
BEGIN
  SELECT SUM(total), COUNT(*) INTO total, cnt
  FROM orders WHERE user_id = uid;
END;
$$ LANGUAGE plpgsql STABLE;

SELECT * FROM stats(42);   -- total | cnt

Penanganan Pengecualian

BEGIN ... EXCEPTION WHEN ... THEN:

BEGIN
  INSERT INTO users (email) VALUES ($1);
EXCEPTION
  WHEN unique_violation THEN
    RAISE NOTICE 'email already exists';
  WHEN OTHERS THEN
    RAISE;
END;

RAISE untuk Pencatatan

Tingkat: DEBUG, LOG, INFO, NOTICE, WARNING, EXCEPTION:

RAISE NOTICE 'processed % rows', cnt;
RAISE EXCEPTION 'bad state: %', state USING ERRCODE = 'check_violation';

Penanda Volatilitas

Tandai fungsi dengan benar untuk perencana:

  • IMMUTABLE — argumen yang sama selalu menghasilkan hasil yang sama (tanpa I/O); memungkinkan penyisipan langsung dan penggunaan yang dapat diindeks
  • STABLE — argumen yang sama menghasilkan hasil yang sama dalam satu query
  • VOLATILE — dapat berbeda pada setiap pemanggilan (default; tepat untuk NOW(), RANDOM())

SECURITY DEFINER

Berjalan dengan hak istimewa pemilik fungsi — gunakan dengan hati-hati:

CREATE FUNCTION sensitive_op() RETURNS VOID
LANGUAGE plpgsql
SECURITY DEFINER
AS $$ ... $$;

-- Always set search_path explicitly to avoid hijacking:
ALTER FUNCTION sensitive_op() SET search_path = public, pg_temp;

Ringkasan

PL/pgSQL memperluas SQL dengan perulangan, IF, pengecualian, dan pengembalian terstruktur. Gunakan untuk logika kohesif yang terdiri dari beberapa langkah dan mendapat manfaat dari eksekusi dekat dengan data.

Cek Cepat

Penanda volatilitas mana yang sebaiknya digunakan untuk fungsi yang mengembalikan hasil yang sama jika diberi argumen yang sama, tanpa efek samping atau operasi masukan/keluaran?

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Dasar-Dasar Fungsi PL/pgSQL” gratis?

Ya — teks lengkap “Dasar-Dasar Fungsi PL/pgSQL” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Dasar-Dasar Fungsi PL/pgSQL”?

Tulis fungsi PL/pgSQL dengan parameter, RETURNS TABLE, alur kendali (IF, LOOP, FOREACH), dan penanganan pengecualian Kamu berlatih SQL Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai SQL Academy?

Tidak diperlukan pengalaman sebelumnya. SQL Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Dasar-Dasar Fungsi PL/pgSQL” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Academy ini?

Ya. Setiap pelajaran SQL Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Anatomi Pemicu: BEFORE/AFTER, FOR EACH ROW
  2. Dasar-Dasar Fungsi PL/pgSQL
  3. Blok DO dan Kode Anonim
  4. Mengaudit Tabel dengan Pemicu
← Kembali ke SQL Academy