طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 122 · برمجة قواعد البيانات
الدرس 1 · الوحدة 1: مقدمة للبرمجة الإجرائية

لماذا البرمجة الإجرائية داخل قاعدة البيانات؟

لماذا نكتب برامج داخل قاعدة البيانات نفسها؟ وما PL/SQL وأخواتها؟ ⏱ نحو 35 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تفرّق بين SQL التصريحية والبرمجة الإجرائية داخل قاعدة البيانات.
  • تعرف PL/SQL وأخواتها، ولماذا نتعلم بـ PL/pgSQL.
  • تتعرف على جداول قاعدة المتجر.
  • تكتب كتلة DO فيها متغير و SELECT INTO و RAISE NOTICE.

١SQL تقول «ماذا»، والإجرائية تضيف «كيف»

في مقرر مبادئ قواعد البيانات كتبت استعلامات SQL: تصف ماذا تريد (SELECT name FROM products WHERE stock = 0)، وتترك لقاعدة البيانات أن تقرر كيف تجده. هذه لغة تصريحية Declarative.

لكن العمل الحقيقي يحتاج أحيانًا خطوات: «إذا نقص المخزون عن 5 فأنشئ طلب توريد، وإلا فسجّل البيع، وفي الحالتين حدّث الرصيد». هنا نحتاج متغيرات وشروطًا وحلقات تعمل داخل قاعدة البيانات. هذه هي البرمجة الإجرائية Procedural.

SQL وحدهامع البرمجة الإجرائية
الأسلوبأمر واحد يصف النتيجةكتلة خطوات: متغيرات، و IF، و LOOP
أين تُكتب منطق الخطوات؟في التطبيق (PHP أو JavaScript…)في قاعدة البيانات نفسها، قرب البيانات
عدد الرحلات عبر الشبكةرحلة لكل استعلامرحلة واحدة تنفّذ كل الخطوات
قواعد العملمكررة في كل تطبيق يستخدم القاعدةمكتوبة مرة واحدة، يلتزم بها الجميع

٢PL/SQL وأخواتها

كل نظام قواعد بيانات كبير أضاف إلى SQL لغة إجرائية. أشهرها PL/SQL من Oracle (المذكورة في خطة المقرر)، وعلى نمطها بُنيت PL/pgSQL في PostgreSQL التي نستخدمها هنا:

النظاماللغة الإجرائيةملاحظة
OraclePL/SQLالأقدم والأشهر في الشركات الكبيرة
PostgreSQLPL/pgSQLمبنية على PL/SQL: البنية والكلمات متقاربة جدًّا. نستخدمها في هذا المقرر
MySQL / MariaDBStored Programsإجراءات ودوال ومحفزات بصياغة أبسط
SQL ServerT-SQLمن Microsoft

٣بيئة العمل

في هذا المقرر لا تحتاج تثبيت شيء: محرك PostgreSQL حقيقي يعمل في متصفحك. يُحمَّل أول مرة تضغط فيها ▶ تشغيل (نحو 6 ميغابايت)، ثم يعمل فورًا.

البيئةعلى جهازكعلى الويب
PostgreSQLخادم PostgreSQL مع pgAdmin أو الطرفية psqlهذه الصفحة
OracleOracle Database XE مع SQL DeveloperOracle Live SQL (مجاني بحساب Oracle)
MySQLXAMPP مع phpMyAdmin أو MySQL Workbench—

٤قاعدة «متجر الريان»

نتدرّب في المقرر على قاعدة متجر صغيرة: تصنيفات ومنتجات، وعملاء وطلبات، وبنود كل طلب. اعرف جداولها، فستعود إليها في كل درس:

categories 5 rows

  • id integer PK
  • name text

products 12 rows

  • id integer PK
  • name text
  • category_id integer FK→categories
  • price numeric(8,2)
  • stock integer

customers 8 rows

  • id integer PK
  • name text
  • city text
  • email text
  • joined date

orders 12 rows

  • id integer PK
  • customer_id integer FK→customers
  • order_date date
  • status text

order_items 21 rows

  • order_id integer PKFK→orders
  • product_id integer PKFK→products
  • qty integer
  • unit_price numeric(8,2)
query.sql
SELECT id, name, price, stock FROM products ORDER BY id LIMIT 5;
النتيجة · 5 صفوف
idnamepricestock
1حاسب محمول32007
2جهاز لوحي145012
3شاشة 27 بوصة9804
4فأرة لاسلكية7560
5لوحة مفاتيح14035

استعلام SQL عادي يعمل كما تعلّمت. اضغط ✏️ جرّب وعدّل وغيّر الشرط أو الأعمدة؛ كل تشغيل يبدأ من القاعدة الأصلية، فلا تخف من التجربة.

٥أول كتلة إجرائية: DO

أصغر برنامج إجرائي كتلة مجهولة Anonymous block: تُكتب وتُنفّذ مرة واحدة ولا تُحفظ. وRAISE NOTICE تطبع رسالة، مثل print في بايثون:

query.sql
DO $$BEGIN  RAISE NOTICE 'مرحبًا من داخل قاعدة البيانات';END $$;
NOTICE: مرحبًا من داخل قاعدة البيانات
✓ نُفّذت الكتلة

الكتلة بين BEGIN و END، والعلامتان $$ تحيطان نصها كاملًا. الرسالة ظهرت في الشريط الداكن (NOTICE).

وتستطيع الكتلة أن تقرأ من الجداول وتحفظ النتيجة في متغير تعرّفه في قسم DECLARE، ثم تطبعه. علامة % في الرسالة تُستبدل بالقيمة:

query.sql
DO $$DECLARE  n int;BEGIN  SELECT count(*) INTO n FROM products;  RAISE NOTICE 'عدد المنتجات: %', n;END $$;
NOTICE: عدد المنتجات: 12
✓ نُفّذت الكتلة

توقّع وتحقّق

لغة Oracle الإجرائية اسمها:

وعلى نمطها بُنيت PL/pgSQL.

ما الذي تضيفه البرمجة الإجرائية إلى SQL؟

أين يُعرَّف المتغير في الكتلة؟

ماذا تفعل RAISE NOTICE؟

مثل print.

الخلاصة

تحدٍّ برمجي: عدّاد عملاء الرياض

تمهيدي

اكتب كتلة DO تحسب عدد العملاء في مدينة الرياض وتطبع النتيجة.

المطلوب:
  • متغير من النوع int في قسم DECLARE.
  • استعلام يحسب عملاء الرياض ويحفظ العدد في المتغير بـ INTO.
  • رسالة NOTICE نصها: عدد عملاء الرياض: 3 (الرقم من المتغير لا مكتوب باليد).
👀 اعرض الناتج المطلوب
NOTICE: عدد عملاء الرياض: 3
✓ التحقق الآلي من حلّك:
  • الكود يعمل بلا أخطاء
  • الرسالة «عدد عملاء الرياض: 3»
  • العدد يُحفظ في متغير بـ INTO
  • الرقم يُطبع من المتغير بـ %
  • تعريف متغير في DECLARE

💡 تلميح 1
انسخ المثال الثاني في الدرس وغيّر الاستعلام: WHERE city = 'الرياض'.
💡 تلميح 2
الرسالة: 'عدد عملاء الرياض: %', n.

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

solution.sql
DO $$DECLARE  n int;BEGIN  SELECT count(*) INTO n FROM customers WHERE city = 'الرياض';  RAISE NOTICE 'عدد عملاء الرياض: %', n;END $$;
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس