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

0 الأسهم
0
0
0
0

مقدمة

عادةً، عند العمل مع قاعدة بيانات علائقية، تُصدر عبارات لغة الاستعلامات الهيكلية (SQL) لاسترجاع البيانات أو معالجتها، مثل SELECT أو INSERT أو UPDATE أو DELETE، مباشرةً من داخل شيفرة تطبيقك. تعمل هذه العبارات مباشرةً على جداول قاعدة البيانات الأساسية وتعالجها. إذا استُخدمت العبارات نفسها أو مجموعة العبارات في تطبيقات متعددة تصل إلى قاعدة البيانات نفسها، فغالبًا ما تتكرر في كل تطبيق على حدة.

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

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

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

المتطلبات الأساسية

لمتابعة هذا الدليل، ستحتاج إلى جهاز كمبيوتر يعمل بنظام إدارة قواعد بيانات علائقية (RDBMS) قائم على SQL. تم التحقق من صحة التعليمات والأمثلة الواردة في هذا الدليل باستخدام البيئة التالية:

  • خادم يعمل بنظام التشغيل Ubuntu 20.04، مع مستخدم غير جذر يتمتع بامتيازات إدارية وجدار حماية مُهيأ باستخدام UFW
  • تم تثبيت MySQL وتأمينه على الخادم.
  • مقدمة أساسية حول تنفيذ استعلامات SELECT لاسترداد البيانات من قاعدة البيانات

ملاحظة: يُرجى العلم أن العديد من أنظمة إدارة قواعد البيانات العلائقية تستخدم تطبيقها الخاص من SQL، وأن صياغة الإجراءات المخزنة ليست جزءًا من معيار SQL الرسمي. مع أن الأوامر المذكورة في هذا البرنامج التعليمي قد تعمل في أنظمة إدارة قواعد بيانات علائقية أخرى، إلا أن الإجراءات المخزنة خاصة بقاعدة البيانات، وبالتالي قد تختلف الصياغة أو المخرجات الدقيقة إذا اختبرت هذه الأنظمة على نظام آخر غير MySQL.

ستحتاج أيضًا إلى قاعدة بيانات فارغة لإنشاء جداول باستخدام الإجراءات المخزنة. ننصحك بمتابعة قسم "الاتصال بـ MySQL وإعداد قاعدة بيانات نموذجية" أدناه للحصول على تفاصيل حول الاتصال بخادم MySQL وإنشاء قاعدة البيانات التجريبية المستخدمة في الأمثلة الواردة في هذا الدليل.

الاتصال بـ MySQL وإعداد قاعدة بيانات نموذجية

في هذا القسم، سوف تتصل بخادم MySQL وتنشئ قاعدة بيانات نموذجية حتى تتمكن من استخدام الأمثلة المذكورة في هذا الدليل.

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

إذا كان نظام قاعدة بيانات SQL الخاص بك يعمل على خادم بعيد، فقم بتسجيل الدخول إلى الخادم الخاص بك عبر SSH من جهازك المحلي:

ssh sammy@عنوان IP الخاص بخادمك

ثم افتح موجه خادم MySQL واستبدل Sami باسم المستخدم الخاص بك في MySQL:

mysql -u sammy -p

إنشاء قاعدة بيانات باسم الإجراءات:

إنشاء إجراءات قاعدة البيانات؛;

إذا تم إنشاء قاعدة البيانات بنجاح، فسوف تتلقى الإخراج التالي:

استعلام الإخراج جيد، تأثر صف واحد (0.01 ثانية)

لتحديد قاعدة بيانات الإجراءات، قم بتشغيل بيان الاستخدام التالي:

إجراءات الاستخدام؛;

سوف تحصل على النتيجة التالية:

تم تغيير قاعدة بيانات الإخراج

بمجرد تحديد قاعدة بيانات، يمكنك إنشاء جداول مثيلات داخلها. سيحتوي جدول "الأجهزة" على بيانات مُبسّطة حول الأجهزة في قاعدة البيانات. ويحتوي الجدول على الأعمدة التالية:

  • صنع: يمثل هذا العمود كل سيارة يملكها، معبرًا عنها باستخدام نوع البيانات varchar بحد أقصى 100 حرف.
  • النموذج: يحتوي هذا العمود على اسم طراز السيارة، معبرًا عنه باستخدام نوع البيانات varchar بحد أقصى 100 حرف.
  • السنة: يخزن هذا العمود سنة تصنيع السيارة بنوع بيانات int لحفظ القيم الرقمية.
  • القيمة: يخزن هذا العمود قيمة السيارة باستخدام نوع البيانات العشري بحد أقصى 10 أرقام ورقمين بعد النقطة العشرية.

قم بإنشاء جدول العينة باستخدام الأمر التالي:

إنشاء جدول السيارات (make varchar(100)، model varchar(100)، year int، value decimal(10, 2));

إذا تمت طباعة الإخراج التالي، فقد تم إنشاء الجدول:

استعلام الإخراج جيد، 0 صف متأثر (0.00 ثانية)

بعد ذلك، قم بتحميل جدول Cars ببيانات العينة عن طريق تنفيذ عملية INSERT INTO التالية:

أدخل في قيم السيارات ('بورش'، '911 جي تي 3'، 2020، 169700)، ('بورش'، 'كايمان جي تي 4'، 2018، 118000)، ('بورش'، 'باناميرا'، 2022، 113200)، ('بورش'، 'ماكان'، 2019، 27400)، ('بورش'، '718 بوكستر'، 2017، 48880)، ('فيراري'، '488 جي تي بي'، 2015، 254750)، ('فيراري'، 'F8 تريبوتو'، 2019، 375000)، ('فيراري'، 'SF90 سترادال'، 2020، 627000)، ('فيراري'، '812 سوبر فاست'، 2017، 335300)، ('فيراري'، 'GTC4Lusso'، 2016، 268000)؛;

تضيف عملية INSERT INTO عشر سيارات رياضية نموذجية إلى الجدول، منها خمسة طرازات بورشه وخمسة طرازات فيراري. يوضح الناتج التالي إضافة جميع الصفوف الخمسة:

استعلام الإخراج جيد، 10 صفوف متأثرة (0.00 ثانية) السجلات: 10 التكرارات: 0 التحذيرات: 0

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

مقدمة عن الإجراءات المخزنة

تُسمى الإجراءات المخزنة في MySQL والعديد من أنظمة قواعد البيانات العلائقية الأخرى كائنات تحتوي على تعليمة واحدة أو أكثر تُنفَّذ بتسلسل عند استدعائها من قِبل قاعدة البيانات. في أبسط مثال، يُمكن للإجراء المخزن تخزين تعبير شائع ضمن روتين قابل لإعادة الاستخدام، مثل استرداد البيانات من قاعدة بيانات ذات مُرشِّحات مُستخدمة بكثرة. على سبيل المثال، يُمكنك إنشاء إجراء مخزن لاسترداد عملاء متجر إلكتروني قاموا بطلبات خلال الأشهر القليلة الماضية. في أكثر السيناريوهات تعقيدًا، يُمكن للإجراءات المخزنة أن تُمثل برامج شاملة تصف منطق أعمال مُعقَّدًا لتطبيقات قوية.

يمكن أن تتضمن مجموعة التعليمات في الإجراء المُخزَّن عبارات SQL شائعة، مثل استعلامات SELECT أو INSERT، التي تُرجع البيانات أو تُعالجها. بالإضافة إلى ذلك، يمكن للإجراءات المُخزَّنة استخدام ما يلي:

  • يتم تمرير المعلمات إلى الإجراء المخزن أو إرجاعها منه.
  • المتغيرات المعلنة لمعالجة البيانات المسترجعة مباشرة في كود الإجراء.
  • العبارات الشرطية، التي تسمح بتنفيذ أقسام من كود الإجراء المخزن اعتمادًا على شروط معينة، مثل عبارات IF أو CASE.
  • تسمح الحلقات مثل WHILE وLOOP وREPEAT بتنفيذ أقسام من التعليمات البرمجية عدة مرات، مثل كل صف في مجموعة بيانات مسترجعة.
  • تعليمات معالجة الأخطاء، مثل إرجاع رسائل الخطأ إلى مستخدمي قاعدة البيانات الذين لديهم حق الوصول إلى الإجراء.
  • استدعاء إجراءات مخزنة أخرى في قاعدة البيانات.

ملاحظة: تُمكّن البنية النحوية الشاملة التي يدعمها MySQL من كتابة برامج قوية وحل مشاكل معقدة باستخدام الإجراءات المخزنة. يغطي هذا الدليل الاستخدام الأساسي للإجراءات المخزنة فقط، مع تضمين عبارات SQL في نص الإجراء المخزن، ومعلمات الإدخال والإخراج. لا يشمل هذا الدليل تنفيذ التعليمات البرمجية الشرطية، واستخدام المتغيرات، والحلقات، ومعالجة الأخطاء المخصصة. نشجعك على معرفة المزيد عن الإجراءات المخزنة في وثائق MySQL الرسمية.

 

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

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

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

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

فيما يلي الهيكل العام لكود SQL المستخدم لإنشاء إجراء مخزن:

فاصل // إنشاء إجراء procedure_name(parameter_1, parameter_2, . . ., parameter_n) BEGIN instruction_1; instruction_2; . . . . instruction_n; END // فاصل؛ ;

التعليمات الأولى والأخيرة في مقتطف الكود هذا هما DELIMITER // وDELIMITER ;. يستخدم MySQL عادةً الفاصلة المنقوطة (;) لتحديد العبارات والإشارة إلى بدايتها ونهايتها. إذا شغّلت أوامر متعددة في وحدة تحكم MySQL، مفصولة بفاصلات منقوطة، فسيتم التعامل معها كأوامر منفصلة وتشغيلها بشكل مستقل، واحدًا تلو الآخر. ومع ذلك، يمكن أن يحتوي الإجراء المخزن على أوامر متعددة يتم تنفيذها بالتتابع عند استدعائها. يتسبب هذا في حدوث مشكلة عند محاولة توجيه MySQL لإنشاء إجراء جديد. يصادف محرك قاعدة البيانات الفاصلة المنقوطة في نص الإجراء المخزن ويعتقد أنه يجب عليه إيقاف تنفيذ الأمر. في هذه الحالة، يكون الأمر المعني هو رمز إنشاء الإجراء بأكمله، وليس تعليمة واحدة في الإجراء نفسه، لذا يُسيء MySQL تفسير قصدك.

للتغلب على هذا القيد، استخدم عبارة DELIMITER لتغيير الفاصل مؤقتًا من ; إلى // طوال مدة استدعاء CREATE PROCEDURE. بعد ذلك، تُرسل جميع الفواصل المنقوطة داخل نص الإجراء المُخزّن إلى الخادم كما هي. بعد اكتمال الإجراء بالكامل، يُغيّر الفاصل إلى ; مع آخر فاصل ;.

جوهر شيفرة إنشاء إجراء جديد هو استدعاء CREATE PROCEDURE، متبوعًا باسم الإجراء: procedure_name في المثال. يتبع اسم الإجراء قائمة اختيارية بالمعلمات التي يقبلها الإجراء. الجزء الأخير هو نص الإجراء، محاطًا بعبارتي BEGIN وEND. يحتوي شيفرة الإجراء على ما يمكن أن يحتوي على عبارة SQL، مثل استعلام SELECT، أو شيفرة أكثر تعقيدًا.

ينتهي الأمر END بـ //، وهو فاصل مؤقت، بدلاً من الفاصلة المنقوطة العادية.

في القسم التالي، يمكنك إنشاء إجراء مخزن أساسي بدون معلمات يغلف استعلامًا.

إنشاء إجراء مخزن بدون معلمات

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

ابدأ بتنفيذ عبارة SELECT التي تريد استخدامها:

اختر * من السيارات حسب الماركة والقيمة الوصف؛;

تقوم قاعدة البيانات بإرجاع قائمة السيارات من جدول السيارات، أولاً حسب العلامة التجارية ثم داخل العلامة التجارية، حسب القيمة بترتيب تنازلي:

الإخراج +---------+--------------+-----------+ | صنع نموذج | سنة | القيمة | +---------+--------------+-----------+-----------+ | فيراري | SF90 سترادال 2020 | 627000.00 | | فيراري | اف 8 تريبوتو 2019 | 375000.00 | | فيراري | 812 فائق السرعة | 2017 | 335300.00 | | فيراري | جي تي سي 4 لوسو 2016 | 268000.00 | | فيراري | 488 جي تي بي | 2015 | 254750.00 | | بورش 911 جي تي 3 | 2020 | 169700.00 | | بورش كايمان جي تي 4 | 2018 | 118000.00 | | بورش باناميرا 2022 | 113200.00 | | بورش 718 بوكستر | 2017 | 48880.00 | | بورش ماكان | 2019 | 27400.00 | +---------+---------------+-----------+ 10 صفوف في المجموعة (0.00 ثانية)

توجد سيارة فيراري الأكثر قيمة في أعلى القائمة، بينما توجد سيارة بورش الأقل قيمة في أسفل القائمة.

لنفترض أن هذا الاستعلام يُستخدم بشكل متكرر في تطبيقات متعددة أو من قِبل عدة مستخدمين، ونفترض أنك تريد التأكد من أن الجميع يستخدم نفس الطريقة لترتيب النتائج. للقيام بذلك، ستحتاج إلى إنشاء إجراء مُخزَّن يخزن هذا التعبير ضمن إجراء مُسمَّى قابل لإعادة الاستخدام.

لإنشاء هذا الإجراء المخزن، قم بتشغيل مقتطف التعليمات البرمجية التالي:

فاصل // إنشاء إجراء get_all_cars() BEGIN SELECT * FROM cars ORDER BY الماركة، القيمة DESC؛ END // فاصل؛ ;

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

يتبع عبارة SQL الخاصة بـ CREATE PROCEDURE اسم الإجراء get_all_cars، والذي يمكنك تعريفه لوصف وظيفة الإجراء على النحو الأمثل. بعد اسم الإجراء، يوجد زوج من الأقواس () لإضافة معلمات. في هذا المثال، لا يستخدم الإجراء معلمات، لذا تكون الأقواس فارغة. بعد ذلك، بين عبارتي BEGIN وEND اللتين تحددان بداية ونهاية كتلة التعليمات البرمجية للإجراء، تُكتب عبارة SELECT المستخدمة سابقًا حرفيًا.

ستستجيب قاعدة البيانات برسالة نجاح:

استعلام الإخراج جيد، 0 صف متأثر (0.02 ثانية)

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

لتنفيذ إجراء مُخزَّن، يمكنك استخدام أمر CALL SQL متبوعًا باسم الإجراء. جرِّب تنفيذ الإجراء المُنشأ حديثًا كما يلي:

اتصل بـ get_all_cars؛;

اسم الإجراء، get_all_cars، هو كل ما تحتاجه لاستخدامه. لم تعد بحاجة إلى كتابة أي جزء من جملة SELECT يدويًا كما كنت تستخدمها سابقًا. تُنفّذ قاعدة البيانات النتائج تمامًا مثل مُخرَج جملة SELECT:

الإخراج +---------+--------------+-----------+ | صنع نموذج | سنة | القيمة | +---------+--------------+-----------+-----------+ | فيراري | SF90 سترادال 2020 | 627000.00 | | فيراري | اف 8 تريبوتو 2019 | 375000.00 | | فيراري | 812 فائق السرعة | 2017 | 335300.00 | | فيراري | جي تي سي 4 لوسو 2016 | 268000.00 | | فيراري | 488 جي تي بي | 2015 | 254750.00 | | بورش 911 جي تي 3 | ٢٠٢٠ | ١٦٩٧٠٠.٠٠ | | بورش كايمان جي تي ٤ | ٢٠١٨ | ١١٨٠٠٠.٠٠ | | بورش باناميرا ٢٠٢٢ | ١١٣٢٠٠.٠٠ | | بورش ٧١٨ بوكستر | ٢٠١٧ | ٤٨٨٨٠.٠٠ | | بورش ماكان | ٢٠١٩ | ٢٧٤٠٠.٠٠ | +----------+--------------+-------+-----------+------------+ ١٠ صفوف في المجموعة (٠.٠٠ ثانية) الاستعلام صحيح، لا يوجد أي صف متأثر (٠.٠٠ ثانية)

لقد نجحت الآن في إنشاء إجراء مُخزَّن بدون أي مُعاملات، يُرجع جميع السيارات من جدول السيارات مُرتَّبةً بطريقة مُحدَّدة. يُمكنك استخدام هذه الطريقة في تطبيقات مُتعدِّدة.

في القسم التالي، يمكنك إنشاء إجراء يقبل المعلمات لتغيير سلوك الإجراء اعتمادًا على إدخال المستخدم.

إنشاء إجراء مخزن مع معلمات الإدخال

في هذا القسم، تُضيف معلمات إدخال إلى تعريف الإجراء المُخزَّن للسماح للمستخدمين الذين يُشغِّلون الإجراء بتمرير البيانات إليه. على سبيل المثال، يُمكن للمستخدمين توفير مُرشِّحات استعلام.

الإجراء المُخزَّن السابق get_all_cars يسترجع دائمًا جميع السيارات من جدول cars. لنُنشئ إجراءً آخر للبحث عن سيارات من سنة تصنيع مُحدَّدة. لتمكين ذلك، حدّد مُعاملًا باسم get_all_cars في تعريف الإجراء.

قم بتشغيل الكود التالي:

فاصل // إنشاء إجراء get_cars_by_year(IN year_filter int) BEGIN SELECT * FROM cars WHERE year = year_filter ORDER BY الماركة، القيمة DESC؛ END // فاصل؛ ;

هناك العديد من التغييرات على كود إنشاء الإجراء من القسم السابق.

أولاً، الاسم هو get_cars_by_year، والذي يصف الطريقة: استرداد السيارات بناءً على سنة تصنيعها.

تحتوي الأقواس الفارغة السابقة الآن على تعريف معامل: IN year_filter int. تُخبر الكلمة المفتاحية IN قاعدة البيانات بأن المعامل يُمرر إلى الإجراء من قِبل المستخدم المُستدعي. year_filter هو اسم عشوائي للمعامل، ويُستخدم للإشارة إلى المعامل في كود الإجراء. وأخيرًا، int هو نوع البيانات. في هذه الحالة، يُعبَّر عن سنة الصنع كقيمة عددية.

يظهر معامل year_filter المحدد بعد اسم الإجراء في عبارة SELECT في البند WHERE year = year_filter ويقوم بتصفية جدول السيارات حسب سنة تصنيعها.

ستستجيب قاعدة البيانات مرة أخرى برسالة نجاح:

استعلام الإخراج جيد، 0 صف متأثر (0.02 ثانية)

حاول تشغيل الإجراء دون تمرير أي معلمات إليه، تمامًا كما في السابق:

اتصل بـ get_cars_by_year؛;

تعيد قاعدة بيانات MySQL رسالة الخطأ:

رسالة الخطأ ERROR 1318 (42000): عدد غير صحيح من الوسائط لـ PROCEDURE actions.get_cars_by_year؛ كان من المتوقع 1، وحصلت على 0

هذه المرة، يتوقع الإجراء المُخزَّن توفير مُعامل، ولكن لم يُقدَّم أيٌّ منه. لاستدعاء إجراء مُخزَّن مع مُعاملات، يُمكنك توفير قيم المُعاملات بين قوسين بنفس الترتيب الذي يتوقعه الإجراء. لاسترجاع السيارات المُصنّعة في عام ٢٠١٧، نفِّذ ما يلي:

اتصل بـ get_cars_by_year(2017)؛;

الآن يتم تنفيذ الإجراء المستدعى بشكل صحيح ويعيد قائمة السيارات لذلك العام:

الناتج +----------+--------------+--------+-----------+ | الماركة، الطراز | السنة | القيمة | +-----------+-------------+-----------+-----------+ | فيراري | 812 سوبر فاست | 2017 | 335300.00 | | بورشه 718 بوكستر | 2017 | 48880.00 | +----------+---------------+---------+-----------+-----------+ صفان في المجموعة (0.00 ثانية) الاستعلام صحيح، لا يوجد صف متأثر (0.00 ثانية)

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

في القسم التالي، سوف تستخدم معلمات الإخراج لإنشاء إجراءات تقوم بإرجاع قيم متعددة مختلفة في تنفيذ واحد.

إنشاء إجراء مخزن مع معلمات الإدخال والإخراج

في كلا المثالين السابقين، استدعت الإجراءات المخزنة التي أنشأتها عبارة SELECT لإرجاع مجموعة من النتائج. ولكن في بعض الحالات، قد تحتاج إلى إجراء مخزن يُرجع عدة قيم مختلفة معًا بدلاً من مجموعة نتائج واحدة للاستعلام.

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

للقيام بذلك، يمكنك استخدام معلمات الإخراج عند إنشاء إجراء مخزّن جديد. وكما هو الحال مع معلمات الإدخال، ترتبط معلمات الإخراج باسم ونوع بيانات. ومع ذلك، بدلاً من تمرير البيانات إلى الإجراء المخزّن، يمكن ملؤها ببيانات من الإجراء المخزّن لإرجاع القيم إلى المستخدم المستدعي.

قم بإنشاء إجراء get_car_stats_by_year الذي يقوم بإرجاع بيانات موجزة للسيارات من سنة إنتاج معينة، باستخدام معلمات الإخراج:

فاصل // إنشاء إجراء get_car_stats_by_year( IN year_filter int, OUT cars_number int, OUT min_value decimal(10, 2), OUT avg_value decimal(10, 2), OUT max_value decimal(10, 2) ) BEGIN SELECT COUNT(*), MIN(value), AVG(value), MAX(value) INTO cars_number, min_value, avg_value, max_value FROM cars WHERE year = year_filter ORDER BY make, value DESC; END // فاصل؛ ;

هذه المرة، إلى جانب مُعامل IN year_filter، المُستخدم لتصفية السيارات حسب سنة الصنع، توجد أربعة مُعاملات OUT مُعرّفة في مربع الأقواس. يُمثّل مُعامل cars_number بنوع البيانات int، ويُستخدم لإرجاع عدد السيارات في المجموعة. تُمثّل مُعاملات min_value وavg_value وmax_value القيمة السوقية، وهي مُعرّفة بالنوع العشري (10، 2) (على غرار عمود القيمة في جدول cars). تُستخدم هذه المُعاملات لإرجاع معلومات حول أرخص وأغلى السيارات في المجموعة، بالإضافة إلى متوسط سعر جميع السيارات المُطابقة.

تبحث عبارة SELECT عن أربع قيم من جدول السيارات باستخدام الدوال الرياضية SQL: COUNT للحصول على العدد الإجمالي للسيارات وMIN وAVG وMAX للحصول على الحد الأدنى والمتوسط ​​والحد الأقصى للقيم من عمود القيمة.

لإخبار قاعدة البيانات بضرورة تخزين نتائج هذا الاستعلام في معلمات إخراج الإجراء المُخزَّن، أُضيفت كلمة رئيسية جديدة تُسمى INTO. بعد كلمة INTO، تُدرَج أسماء معلمات الإجراء الأربعة المتعلقة بالبيانات المُسترجَعة. سيؤدي هذا إلى تخزين MySQL لقيمة COUNT(*) في معلمة cars_number، ونتيجة MIN(value) في معلمة min_value، وهكذا.

تؤكد قاعدة البيانات إنشاء الإجراء بنجاح:

استعلام الإخراج جيد، 0 صف متأثر (0.02 ثانية)

الآن قم بتشغيل الروتين الجديد عن طريق تشغيل الأمر التالي:

اتصل بـ get_car_stats_by_year(2017، @number، @min، @avg، @max)؛;

تبدأ المعلمات الأربعة الجديدة بالرمز @. هذه هي أسماء المتغيرات المحلية في وحدة تحكم MySQL التي يمكنك استخدامها لتخزين البيانات مؤقتًا. عند تمريرها إلى الإجراء المُخزّن الذي أنشأته، يُدرج الإجراء قيمًا في تلك المتغيرات.

ستستجيب قاعدة البيانات بما يلي:

استعلام الإخراج جيد، تأثر صف واحد (0.00 ثانية)

يختلف هذا عن السلوك السابق، حيث كانت النتائج تُعرض فورًا على الشاشة. وذلك لأن نتائج الإجراء المُخزَّن تُخزَّن في مُعاملات الإخراج ولا تُعاد كنتائج استعلام. للوصول إلى النتائج، يمكنك تحديدها مباشرةً في واجهة MySQL كما يلي:

حدد @الرقم، @الحد الأدنى، @المتوسط، @الحد الأقصى؛;

باستخدام هذا الاستعلام، يمكنك تحديد قيم من متغيرات محلية، بدلاً من استدعاء الإجراء مرة أخرى. يخزن الإجراء المُخزّن نتائجه في تلك المتغيرات، وتكون البيانات متاحة حتى الخروج من واجهة البرنامج.

ملاحظة: لمزيد من المعلومات حول استخدام المتغيرات المُعرّفة من قِبل المستخدم في MySQL، راجع قسم "المتغيرات المُعرّفة من قِبل المستخدم" في الوثائق. عند استخدامها في تطوير التطبيقات، تختلف طرق الوصول إلى البيانات المُعادة من الإجراءات المُخزّنة باختلاف لغات البرمجة وأطر العمل. في حال وجود أي شكوك، يُرجى مراجعة وثائق اللغة وإطار العمل المُختارين.

يعرض الإخراج قيم متغيرات الاستعلام:

الناتج +---------+----------+-----------+-----------+ | @number | @min | @avg | @max | +-----------+------------+------------+-----------+ | 2 48880.00 | 192090.00 | 335300.00 | +----------+----------+-----------+-----------+-----------+ صف واحد في المجموعة (0.00 ثانية)

تتوافق القيم مع عدد السيارات المنتجة في عام 2017، وكذلك الحد الأدنى والمتوسط ​​والأقصى للقيمة السوقية للسيارات من سنة الإنتاج هذه.

في هذا المثال، تعلمت كيفية استخدام معلمات الإخراج لإرجاع قيم متعددة مختلفة من داخل إجراء مُخزَّن لاستخدامها لاحقًا. في القسم التالي، ستتعلم كيفية حذف الإجراءات المُنشأة.

حذف الإجراءات المخزنة

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

في بعض الأحيان، قد لا تكون هناك حاجة لإجراء أنشأته. في حالات أخرى، قد ترغب في تغيير طريقة عمله. لا يسمح لك MySQL بتغيير تعريف إجراء بعد إنشائه، لذا فإن الطريقة الوحيدة هي حذف الإجراء أولًا ثم إعادة إنشائه بالتغييرات المطلوبة.

لنحذف الإجراء الأخير، get_car_stats_by_year. للقيام بذلك، يمكنك استخدام عبارة DROP PROCEDURE:

إجراء الإسقاط get_car_stats_by_year؛;

تؤكد قاعدة البيانات الحذف الناجح للإجراء برسالة نجاح:

استعلام الإخراج جيد، 0 صف متأثر (0.02 ثانية)

يمكنك التحقق من حذف الإجراء عن طريق محاولة استدعائه. قم بتشغيل:

اتصل بـ get_car_stats_by_year(2017، @number، @min، @avg، @max)؛;

هذه المرة، ستظهر لك رسالة خطأ تفيد بأن الإجراء غير موجود في قاعدة البيانات:

رسالة الخطأ ERROR 1305 (42000): PROCEDURE actions.get_car_stats_by_year غير موجود

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

نتيجة

باتباع هذا الدليل، تعلّمتَ ماهية الإجراءات المُخزّنة وكيفية استخدامها في MySQL لتخزين عبارات قابلة لإعادة الاستخدام في إجراءات مُسمّاة وتنفيذها لاحقًا. أنشأتَ إجراءات مُخزّنة بدون مُعاملات، وإجراءات تستخدم مُعاملات إدخال وإخراج لجعلها أكثر مرونة.

[المجموع: 1   متوسط: 5/5]
اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

قد يعجبك أيضاً

ما هو Three.js؟

مقدمة يقوم Three.js بالعديد من الأشياء وقد يكون من الصعب بعض الشيء كيفية العمل معه...