أساسيات دوال 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تشريح المشغلات: BEFORE/AFTER، وFOR EACH ROW
- أساسيات دوال PL/pgSQL
- كتل DO والتعليمات البرمجية المجهولة
- تدقيق الجداول باستخدام المشغلات