0Pricing
SQL Academy · درس

أساسيات دوال PL/pgSQL

اكتب دوال PL/pgSQL باستخدام المعلمات وRETURNS TABLE وتدفق التحكم (IF وLOOP وFOREACH) ومعالجة الاستثناءات

أساسيات دوال PL/pgSQL درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.

ما هي PL/pgSQL؟

لغة PostgreSQL الإجرائية المضمّنة. وهي SQL موسّعة بمتغيرات وتدفق تحكم واستثناءات وإمكانية استدعاء الاستعلامات ديناميكيًا. تُستخدم في الإجراءات المخزنة ودوال المشغّلات.

هيكل الدالة

دالة بسيطة:

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

المتغيرات

صرّحوا عنها باستخدام DECLARE، وأسندوا إليها القيم باستخدام := أو 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;

تدفق التحكم

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;

التكرار على نتائج الاستعلام

التكرار بأسلوب المؤشر:

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

إرجاع مجموعة نتائج:

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);

معاملات IN / OUT / INOUT

قيم إرجاع متعددة:

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

معالجة الاستثناءات

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 للتسجيل

المستويات: DEBUG وLOG وINFO وNOTICE وWARNING وEXCEPTION:

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

محددات قابلية التغير

حدّدوا الدوال بشكل صحيح للمخطط:

  • IMMUTABLE — تؤدي المعاملات نفسها دائمًا إلى النتيجة نفسها (من دون عمليات إدخال وإخراج)؛ وتسمح بالتضمين والاستخدام القابل للفهرسة
  • STABLE — تؤدي المعاملات نفسها إلى النتيجة نفسها ضمن الاستعلام
  • VOLATILE — قد تختلف النتيجة في كل استدعاء (وهو الافتراضي؛ والمناسب لـ NOW() وRANDOM())

SECURITY DEFINER

يعمل بامتيازات مالك الدالة — يُرجى استخدامه بحذر:

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;

مراجعة

توسّع PL/pgSQL لغة SQL بإضافة الحلقات وعبارات IF والاستثناءات وعمليات الإرجاع المنظّمة. استخدموها للمنطق المتماسك متعدد الخطوات الذي يستفيد من التنفيذ بالقرب من البيانات.

تحقق سريع

ما محدد التغيّر الذي ينبغي استخدامه لدالة تُرجع النتيجة نفسها عند إعطائها الوسائط نفسها، من دون آثار جانبية أو عمليات إدخال وإخراج؟

الأسئلة الشائعة

هل درس «أساسيات دوال PL/pgSQL» مجاني؟

نعم — نص درس «أساسيات دوال PL/pgSQL» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.

ماذا ستتعلم في «أساسيات دوال PL/pgSQL»؟

اكتب دوال PL/pgSQL باستخدام المعلمات وRETURNS TABLE وتدفق التحكم (IF وLOOP وFOREACH) ومعالجة الاستثناءات تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟

لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «أساسيات دوال PL/pgSQL»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟

نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تشريح المشغلات: BEFORE/AFTER، وFOR EACH ROW
  2. أساسيات دوال PL/pgSQL
  3. كتل DO والتعليمات البرمجية المجهولة
  4. تدقيق الجداول باستخدام المشغلات
← العودة إلى SQL Academy