ما الفرق بين In و Out و Inout في mysql ؟

السلام عليكم ورحمة الله

أريد شرح للفرق بين  In و Out و Inout في mysql مع بعض الأمثلة لتبسيط الموضوع وشكرا مقدما!

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

سأحاول توضيح الفرق بين هذه المعاملات بشكل بسيط كالتالي

IN:

يُستخدم المعاملات IN لتمرير القيم إلى الإجراءات المخزنة أو الدوال. تكون هذه المعاملات قابلة للقراءة فقط داخل الإجراء أو الدالة ولا يُمكن تعديلها. يتم تمرير القيم إلى المعاملات IN عند استدعاء الإجراء أو الدالة.

مثال:

CREATE PROCEDURE getCustomer(IN customerID INT)
BEGIN
SELECT * FROM customers WHERE id = customerID;
END;

في هذا المثال، يتم استدعاء إجراء getCustomer وتمرير قيمة محددة للمعامل IN "customerID". يتم استخدام هذه القيمة في الاستعلام SELECT داخل الإجراء لاسترجاع معلومات العميل المطلوب.

بالنسبة ل OUT:

يُستخدم المعاملات OUT لإرجاع القيم من الإجراءات المخزنة أو الدوال. يعني ذلك أنه يمكن تعديل قيمة المعامل OUT داخل الإجراء أو الدالة وستُرجع القيمة المعدلة إلى المكان الذي تم استدعاء الإجراء أو الدالة منه.

مثال:

CREATE PROCEDURE calculateVAT(IN price DECIMAL(10,2), OUT vat DECIMAL(10,2))
BEGIN
SET vat = price * 0.15;
END;

أما بالنسبة ل INOUT:

تُستخدم المعاملات INOUT لتمرير القيم إلى الإجراءات المخزنة أو الدوال واسترجاع القيم المعدلة منها. يعني ذلك أنه يمكن قراءة وتعديل قيمة المعامل INOUT داخل الإجراء أو الدالة وستُرجع القيمة المعدلة إلى المكان الذي تم استدعاء الإجراء أو الدالة منه.

مثال:

CREATE PROCEDURE updateStock(INOUT quantity INT)
BEGIN
IF quantity > 0 THEN
SET quantity = quantity - 1;
END IF;
END;
Mustafa_Suleiman أضف ردا

في MySQL، يمكن تقسيم معلمات الإجراءات المخزنة إلى ثلاثة أنواع: IN، OUT، وINOUT، حيث يحدد نوع المعلمة اتجاه البيانات بين الإجراءات المخزنة والبرنامج المتصل.

معلمات IN

تُستخدم معلمات IN لتوصيل البيانات إلى الإجراءات المخزنة، ويتم تحديد قيمة المعلمة عند استدعاء الإجراء المخزن، ولا يمكن تغييرها داخل الإجراء المخزن.

مثال:

CREATE PROCEDURE `get_user_name` (IN `user_id` INT)
BEGIN
  SELECT `name` FROM `users` WHERE `id` = `user_id`;
END;

هنا user_id هو معلمة IN، وتحدد قيمة user_id عند استدعاء الإجراء المخزن، مع استخدامها لتحديد المستخدم الذي سيتم إرجاع اسمه.

معلمات OUT

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

مثال:

CREATE PROCEDURE `get_user_count` (OUT `count` INT)
BEGIN
  SELECT COUNT(*) INTO `count` FROM `users`;
END;

وcount هو معلمة OUT، حيث تعين قيمة count بواسطة الإجراء المخزن، وتستخدم لتحديد عدد المستخدمين في قاعدة البيانات.

معلمات INOUT

تُستخدم للنقل المتبادل للبيانات بين الإجراءات المخزنة والبرنامج المتصل، ويمكن للبرنامج المتصل تحديد قيمة المعلمة، ويمكن للإجراء المخزن تغييرها.

مثال:

CREATE PROCEDURE `update_user_name` (INOUT `user_id` INT, IN `new_name` VARCHAR(255))
BEGIN
  UPDATE `users` SET `name` = `new_name` WHERE `id` = `user_id`;
END;

هنا user_id و new_name هما معلمات INOUT، ويستطيع البرنامج المتصل تحديد قيمة user_id و new_name، ويمكن للإجراء المخزن تغيير قيمة user_id.

أمثلة إضافية:

استخدام معلمات IN:

  • استدعاء إجراء مخزن لإنشاء سجل جديد في جدول.
  • استدعاء إجراء مخزن لتعديل سجل موجود في جدول.
  • استدعاء إجراء مخزن لإرجاع مجموعة بيانات من جدول.

استخدام معلمات OUT:

  • استدعاء إجراء مخزن لإرجاع عدد السجلات في جدول.
  • استدعاء إجراء مخزن لإرجاع مجموع قيم العمود في جدول.
  • استدعاء إجراء مخزن لإرجاع قيمة مكررة من جدول.

استخدام معلمات INOUT:

  • استدعاء إجراء مخزن لحساب النسبة المئوية للقيم في جدول.
  • استدعاء إجراء مخزن لفرز مجموعة بيانات في جدول.
  • استدعاء إجراء مخزن لتحويل القيم في جدول إلى تنسيق مختلف.

حسنا، سأحاول شرح كل مفهوم على حدة، لتبسيط الموضوع لك، مثلا نجد أن:

In: تُستخدم لإرسال قيمة إلى الإجراء المخزن ولا يمكن تعديل القيمة داخل الإجراء.

على سبيل المثال: إذا كان لدينا إجراء مخزن يأخذ قيمة المتغير "age" كمدخل، فلا يمكن تغيير قيمة "age" داخل الإجراء.

Out: تُستخدم لإرجاع قيمة من الإجراء المخزن، وهنا يمكن تعيين قيمة للمتغير "result" داخل الإجراء واسترجاعها عند انتهاء العملية.

مثلا إذا كان لدينا إجراء مخزن يحسب متوسط العمر، يمكن استخدام "Out" لإرجاع النتيجة.

أما Inout: فتُستخدم لإرسال قيمة إلى الإجراء واسترجاع قيمة محدثة ويمكن تعديل القيمة داخل الإجراء واسترجاع القيمة المحدثة.

مثلا، إذا كان لدينا إجراء مخزن يزيد قيمة المتغير "counter" بمقدار محدد، هنا يمكن استخدام "Inout" لزيادة قيمة "counter" واسترجاع القيمة المحدثة.