كيفية استخدام الإجراءات المخزنة Stored Procedures في MySQL


إيش هي الإجراءات المخزنة (Stored Procedures)؟

ببساطة، الإجراء المخزن هو مجموعة أوامر SQL يتم تجميعها وتخزينها في قاعدة البيانات نفسها. تقدر تستدعيها بأي وقت وتنفذها كأنها أمر واحد. فكر فيها كدالة أو فانكشن في لغات البرمجة العادية، بس هذي خاصة بقواعد البيانات.

ليش نستخدمها؟

  • أداء أفضل: تتنفذ أسرع لأنها مسبقة الترجمة (pre-compiled) ومخزنة.
  • تقليل حركة الشبكة: بدل ما ترسل عدة أوامر SQL، ترسل أمر واحد لتنفيذ الإجراء المخزن.
  • إعادة الاستخدام: تكتب الكود مرة وحدة وتستخدمه في أي مكان في تطبيقك.
  • أمان أعلى: تقدر تعطي صلاحيات لتنفيذ إجراء معين بدون إعطاء صلاحية الوصول المباشر للجداول.
  • تطبيق منطق العمل: تقدر تحط منطق عمل معقد داخل الإجراء المخزن، وهذا يخلي قاعدة البيانات ذكية أكثر.

كيف ننشئ إجراء مخزن بسيط؟

عشان ننشئ إجراء مخزن، نحتاج نغير محدد الأوامر (delimiter) مؤقتًا لأن الإجراء المخزن ممكن يحتوي على فواصل منقوطة (;) داخله. بعدين نرجعه لوضعه الطبيعي.

ملاحظة: DELIMITER هو أمر خاص بكلاينت MySQL (زي سطر الأوامر) عشان يعرف متى ينتهي الأمر الكامل. داخل الإجراء المخزن، الفاصلة المنقوطة ؛ تستخدم لإنهاء كل جملة SQL.

هذا مثال لإجراء مخزن يجيب كل المستخدمين من جدول اسمه users:

DELIMITER //

CREATE PROCEDURE GetAllUsers()
BEGIN
    SELECT id, name, email FROM users;
END //

DELIMITER ;

كيف نستدعي الإجراء المخزن؟

بسيطة جدًا، نستخدم الأمر CALL وبعده اسم الإجراء مع الأقواس.

CALL GetAllUsers();

الإجراءات المخزنة مع الباراميترات (Parameters)

أغلب الوقت نحتاج نمرر بيانات للإجراء المخزن. هنا يجي دور الباراميترات. فيه ثلاث أنواع:

  • IN: هذا النوع هو الافتراضي، يعني تمرر قيمة للإجراء. الإجراء يستخدمها بس ما يقدر يغيرها.
  • OUT: الإجراء يرجع قيمة لك عن طريق هذا الباراميتر.
  • INOUT: الإجراء يستقبل قيمة ويقدر يعدل عليها ويرجع لك القيمة الجديدة.

مثال على باراميتر IN

هذا الإجراء يجيب معلومات مستخدم محدد بناءً على user_id اللي تمرره له:

DELIMITER //

CREATE PROCEDURE GetUserById(IN user_id INT)
BEGIN
    SELECT id, name, email FROM users WHERE id = user_id;
END //

DELIMITER ;

ولاستدعائه:

CALL GetUserById(5); -- يجيب المستخدم اللي الـ ID حقه 5

مثال على باراميتر OUT

هذا الإجراء يحسب عدد المستخدمين ويرجع العدد هذا في باراميتر OUT.

DELIMITER //

CREATE PROCEDURE GetUserCount(OUT total_users INT)
BEGIN
    SELECT COUNT(*) INTO total_users FROM users;
END //

DELIMITER ;

ولاستدعائه، لازم تعرف متغير عشان تستقبل فيه القيمة الراجعة:

CALL GetUserCount(@user_count);
SELECT @user_count; -- راح يعرض لك عدد المستخدمين

ملاحظة: SELECT COUNT(*) INTO total_users هنا، total_users هو اسم الباراميتر OUT اللي عرفناه في الإجراء.

كيف نحذف إجراء مخزن؟

إذا ما عاد تبغى الإجراء المخزن، تقدر تحذفه بالأمر DROP PROCEDURE.

DROP PROCEDURE IF EXISTS GetAllUsers;

نصيحة: دائمًا استخدم IF EXISTS عشان تتجنب الأخطاء لو الإجراء ما كان موجود.

كيف تشوف الإجراءات المخزنة الموجودة؟

فيه أكثر من طريقة عشان تشوف الإجراءات المخزنة في قاعدة بياناتك:

لعرض حالة كل الإجراءات المخزنة (اسم، قاعدة بيانات، من أنشأه، تاريخ الإنشاء، إلخ):

SHOW PROCEDURE STATUS WHERE Db = 'your_database_name';

لعرض الكود البرمجي لإجراء معين:

SHOW CREATE PROCEDURE GetUserById;

خلاصة

الإجراءات المخزنة أداة قوية جدًا في MySQL، بتساعدك تكتب كود أنظف، أسرع، وأكثر أمانًا. لا تتردد في استخدامها خصوصًا للمهام المتكررة أو اللي تتطلب منطق عمل معقد.