السلام عليكم ورحمة الله
أريد شرح للفرق بين 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;
في 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" واسترجاع القيمة المحدثة.
التعليقات