أماكن عقد ico.  الدليل الكامل لـ ICO (الدليل النهائي لـ ICO).  نتلقى بيانات عن المعاملات في DEX من خدمة datafeed

أماكن عقد ico. الدليل الكامل لـ ICO (الدليل النهائي لـ ICO). نتلقى بيانات عن المعاملات في DEX من خدمة datafeed

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

الإجراءات المخزنة تشبه الوظائف المعرفة من قبل المستخدم (UDFs). يتمثل الاختلاف الرئيسي في أنه يمكن استخدام الوظائف المعرفة من قبل المستخدم مثل أي تعبير آخر في استعلام SQL ، بينما يجب استدعاء الإجراءات المخزنة باستخدام وظيفة CALL:

إجراء الاتصال (...)

تنفيذ الإجراء (...)

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

يختلف تنفيذ الإجراءات المخزنة من DBMS إلى آخر. يدعمها معظم بائعي قواعد البيانات الرئيسيين بشكل أو بآخر. اعتمادًا على نظام إدارة قواعد البيانات (DBMS) ، يمكن تنفيذ الإجراءات المخزنة في لغات برمجة مختلفة مثل SQL أو Java أو C أو C ++. الإجراءات المخزنة المكتوبة بلغة غير SQL قد تنفذ أو لا تنفذ استعلامات SQL من تلقاء نفسها.

خلف

    منطق تقاسم مع التطبيقات الأخرى. تغلف الإجراءات المخزنة الوظائف ؛ هذا يضمن الوصول إلى البيانات والاتصال الإداري بين التطبيقات المختلفة.

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

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

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

ضد

    زيادة الحمل على خادم قاعدة البيانات بسبب حقيقة أن معظم العمل يتم على جانب الخادم ، وأقل من جانب العميل.

    عليك أن تتعلم الكثير. ستحتاج إلى تعلم بناء جملة تعبير MySQL لكتابة الإجراءات المخزنة.

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

    يمكن أن يؤدي الترحيل من نظام DBMS إلى آخر (DB2 أو SQL Server وما إلى ذلك) إلى حدوث مشكلات.

الغرض من الإجراءات المخزنة وفوائدها

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

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

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

في معظم نظم إدارة قواعد البيانات ، في المرة الأولى التي يتم فيها تشغيل إجراء مخزن ، يتم تجميعه (تحليل ويتم إنشاء خطة وصول إلى البيانات). في المستقبل ، تتم معالجتها بشكل أسرع. يفسر Oracle DBMS التعليمات البرمجية الإجرائية المخزنة في قاموس البيانات. بدءًا من Oracle 10g ، يتم دعم ما يسمى بالتجميع الأصلي (التجميع الأصلي) للرمز الإجرائي المخزن في C ثم في رمز الجهاز للجهاز الهدف ، وبعد ذلك ، عندما يتم استدعاء الإجراء المخزن ، يكون كود الكائن المجمع الخاص به هو أعدم مباشرة.

خيارات البرمجة

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

حماية

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

تتيح لك ميزات الأمان هذه عزل بنية قاعدة البيانات عن المستخدم ، مما يضمن تكامل قاعدة البيانات وموثوقيتها.

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

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

عادةً ما يتم إنشاء الإجراءات المخزنة باستخدام لغة SQL أو تنفيذها المحدد في نظام إدارة قواعد البيانات المختار. على سبيل المثال ، لهذه الأغراض ، يحتوي Microsoft SQL Server DBMS على لغة Transact-SQL ، ولدى Oracle PL / SQL ، و InterBase و Firebird لديها PSQL ، و PostgreSQL لديها PL / pgSQL ، و PL / Tcl ، و PL / Perl ، و PL / Python ، و IBM DB2 - SQL / PL (الإنجليزية) ، في Informix - SPL. تتبع MySQL معيار SQL: 2003 عن كثب ، ولغتها تشبه لغة SQL / PL.

في بعض نظم إدارة قواعد البيانات ، من الممكن استخدام الإجراءات المخزنة المكتوبة بأي لغة برمجة قادرة على إنشاء ملفات مستقلة قابلة للتنفيذ ، مثل C ++ أو Delphi. في مصطلحات Microsoft SQL Server ، تسمى هذه الإجراءات الإجراءات المخزنة الموسعة وهي ببساطة وظائف موجودة في Win32-DLL. وعلى سبيل المثال ، في Interbase و Firebird للوظائف التي يتم استدعاؤها من DLL / SO ، يتم تحديد اسم آخر - UDF (وظيفة محددة من قبل المستخدم). في MS SQL 2005 ، أصبح من الممكن كتابة الإجراءات المخزنة بأي لغة من لغات .NET ، ومن المقرر التخلي عن الإجراءات المخزنة الموسعة في المستقبل. يسمح Oracle DBMS بدوره بكتابة الإجراءات المخزنة في Java. في IBM DB2 ، تعد كتابة الإجراءات والوظائف المخزنة في لغات البرمجة التقليدية هي الطريقة التقليدية ، المدعومة من البداية ، ولم تتم إضافة الامتداد الإجرائي لـ SQL إلى DBMS إلا في وقت متأخر جدًا ، بعد أن تم تضمينه في معيار ANSI. كما يدعم Informix إجراءات Java و C.

في Oracle DBMS ، يمكن دمج الإجراءات المخزنة في ما يسمى الحزم. تتكون الحزمة من جزأين - المواصفات (مواصفات الحزمة الإنجليزية) ، والتي تحدد تعريف الإجراء المخزن ، والجسم (نص الحزمة الإنجليزية) ، حيث يقع تنفيذها. وبالتالي ، تسمح لك Oracle بفصل واجهة رمز البرنامج عن تنفيذه.

في IBM DB2 ، يمكن دمج الإجراءات المخزنة في وحدات نمطية.

بناء الجملة

إنشاء الإجراء "p2" ()

محدد أمان SQL

التعليق "إجراء"

حدد "Hello World!" ؛

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

4 خصائص إجراء مخزن:

اللغة: لأغراض قابلية النقل ، الافتراضي هو SQL.

حتمية: إذا كان الإجراء يُرجع نفس النتيجة طوال الوقت ويأخذ نفس معلمات الإدخال. هذا من أجل النسخ المتماثل وعملية التسجيل. القيمة الافتراضية هي NOT DETERMINISTIC.

أمان SQL: أثناء المكالمة ، يتم التحقق من حقوق المستخدم. INVOKER هو المستخدم الذي يستدعي الإجراء المخزن. DEFINER هو "مبتكر" الإجراء. القيمة الافتراضية هي DEFINER.

التعليق: لأغراض التوثيق ، القيمة الافتراضية هي ""

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

CALL store_procedure_name (param1، param2، ....)

إجراء استدعاء 1 (10، "معلمة السلسلة"،parameter_var) ؛

تغيير إجراء مخزن

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

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

إجراء السقوط إذا كان EXISTS p2 ؛

هذا أمر بسيط. العبارة IF EXISTS اكتشاف خطأ في حالة عدم وجود مثل هذا الإجراء.

حدود

إنشاء إجراء proc1 (): قائمة المعلمات فارغة

إنشاء إجراء proc1 (في varname DATA-TYPE): معلمة إدخال واحدة. كلمة IN اختيارية لأن المعلمات الافتراضية هي IN (واردة).

إنشاء إجراء proc1 (OUT varname DATA-TYPE): معلمة إرجاع واحدة.

CREATE PROCEDURE proc1 (INOUT varname DATA-TYPE): معلمة واحدة ، كل من الإدخال والإخراج.

تبدو صيغة التصريح عن متغير كما يلي:

DECLARE varname DATA-TYPE DEFAULT defaultvalue ؛

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

1. العمل من خلال جميع الأمثلة وتحليل نتائج تنفيذها في الأداة المساعدة SQL Server Management Studio. التحقق مما إذا كانت الإجراءات التي تم إنشاؤها موجودة في قاعدة البيانات الحالية.

2. استكمال جميع الأمثلة والمهام في سياق العمل المخبري.

3. إنجاز المهام الفردية حسب الخيارات.

شروحات العمل

لإتقان برمجة الإجراءات المخزنة ، نستخدم مثالاً لقاعدة بيانات تسمى كتب_ DBالذي تم إنشاؤه في مختبر العمل رقم 1. عند تنفيذ الأمثلة والمهام ، انتبه إلى المراسلات بين أسماء قاعدة البيانات والجداول والكائنات الأخرى في المشروع.

الإجراءات المخزنةهي مجموعة من الأوامر تتكون من جملة أو أكثر من عبارات أو وظائف SQL ويتم تخزينها في قاعدة البيانات في نموذج مجمع.

أنواع الإجراءات المخزنة

تم تصميم إجراءات النظام المخزنة لأداء إجراءات إدارية مختلفة. يتم تنفيذ جميع إجراءات إدارة الخادم تقريبًا بمساعدتهم. يمكننا القول أن إجراءات النظام المخزنة هي واجهة توفر العمل مع جداول النظام. تكون إجراءات النظام المخزنة مسبوقة بـ sp_ ، ويتم تخزينها في قاعدة بيانات النظام ، ويمكن استدعاؤها في سياق أي قاعدة بيانات أخرى.

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

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

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

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

بناء الجملة لإنشاء إجراء مخزن جديد أو تعديل موجود في تدوين MS SQL Server هو:

(إنشاء | تغيير) إجراء [EDURE] اسم_إجراء [؛ رقم] [(parameter_name نوع البيانات) [VARYING] [= افتراضي] [إخراج]] [، ... n] [مع (RECOMPILE | ENCRYPTION | RECOMPILE، ENCRYPTION)] [للنسخ] AS sql_statement [... n]

ضع في اعتبارك معلمات هذا الأمر.

باستخدام البادئات sp_ ، # ، ## ، يمكن تعريف الإجراء الذي تم إنشاؤه كنظام أو إجراء مؤقت. كما ترى من بناء جملة الأمر ، لا يُسمح بتحديد اسم المالك الذي ينتمي إليه الإجراء الذي تم إنشاؤه ، وكذلك اسم قاعدة البيانات حيث يجب وضعها. لذلك ، لوضع الإجراء المخزن الذي تقوم بإنشائه في قاعدة بيانات معينة ، يجب عليك تشغيل الأمر CREATE PROCEDURE في سياق قاعدة البيانات هذه. عند الوصول إلى كائنات من نفس قاعدة البيانات من نص إجراء مخزن ، يمكنك استخدام أسماء مختصرة ، أي بدون تحديد اسم قاعدة البيانات. عندما تريد الإشارة إلى كائنات موجودة في قواعد بيانات أخرى ، فإن تحديد اسم قاعدة البيانات أمر إلزامي.

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

يعني وجود الكلمة الأساسية OUTPUT أن المعلمة المقابلة تهدف إلى إرجاع البيانات من إجراء مخزن. ومع ذلك ، هذا لا يعني أن المعلمة غير مناسبة لتمرير القيم إلى إجراء مخزن. يؤدي تحديد الكلمة الأساسية OUTPUT إلى توجيه الخادم ، عند الخروج من الإجراء المخزن ، لتعيين القيمة الحالية للمعامل إلى المتغير المحلي الذي تم تحديده كقيمة المعلمة عند استدعاء الإجراء. لاحظ أنه عند تحديد الكلمة الأساسية OUTPUT ، لا يمكن تعيين قيمة المعلمة المقابلة عند استدعاء الإجراء إلا باستخدام متغير محلي. غير مسموح بأي تعبيرات أو ثوابت مسموح بها للمعلمات العادية. يتم استخدام الكلمة الأساسية VARYING بالاقتران مع معلمة OUTPUT من النوع CURSOR. تحدد أن معلمة الإخراج ستكون مجموعة النتائج.

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

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

مطلوب خيار FOR REPLICATION عند نسخ البيانات بما في ذلك الإجراء المخزن الذي تم إنشاؤه كمقال في منشور. ترشد الكلمة الأساسية ENCRYPTION الخادم إلى تشفير رمز الإجراء المخزن ، والذي يمكن أن يوفر الحماية ضد استخدام خوارزميات الملكية التي تنفذ الإجراء المخزن. يتم وضع الكلمة الأساسية AS في بداية نص الإجراء المخزن نفسه. يمكن استخدام جميع أوامر SQL تقريبًا في نص الإجراء ، ويمكن الإعلان عن المعاملات ، ويمكن تعيين الأقفال ، ويمكن استدعاء الإجراءات المخزنة الأخرى. يمكنك الخروج من إجراء مخزن باستخدام الأمر RETURN.

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

إجراء الإسقاط (اسم_الإجراء) [، ... ن]

تنفيذ إجراء مخزن

يتم استخدام الأمر التالي لتنفيذ إجراء مخزن: [[EXEC [UTE] اسم_إجراء [؛ رقم] [[@ parameter_name =] (القيمة |variable_name) [OUTPUT] | [افتراضي]] [، ... ن]

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

يُسمح باستخدام الكلمة الأساسية OUTPUT في استدعاء الإجراء فقط للمعلمات التي تم الإعلان عنها عندما تم إنشاء الإجراء باستخدام الكلمة الأساسية OUTPUT.

عندما يتم استدعاء إجراء باستخدام الكلمة الأساسية DEFAULT للمعامل ، سيتم استخدام القيمة الافتراضية. بطبيعة الحال ، لا يُسمح بالكلمة المحددة DEFAULT إلا لتلك المعلمات التي تم تحديد قيمة افتراضية لها.

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

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

استخدام RETURN في إجراء مخزن

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

إنشاء إجراء Count_Books AS SELECT COUNT (Code_book) من Books GO

التمرين 1.

عدد_كتب EXEC

تحقق من النتيجة.

مثال على إنشاء إجراء باستخدام معلمة إدخال:

إنشاء الإجراء Count_Books_PagesCount_pages AS INT AS حدد COUNT (Code_book) من الكتب حيث الصفحات> =Count_pages اذهب

المهمة 2. قم بإنشاء هذا الإجراء في قسم Stored Procedures في قاعدة بيانات DB_Books باستخدام الأداة المساعدة SQL server Management Studio. قم بتشغيله باستخدام الأمر

EXEC Count_Books_Pages 100

تحقق من النتيجة.

مثال على إنشاء إجراء باستخدام معلمات الإدخال:

إنشاء الإجراء Count_Books_TitleCount_pages AS INT ،Title AS CHAR (10) AS SELECT COUNT (Code_book) من الكتب حيث الصفحات> =Count_pages AND Title_book LIKETitle GO

المهمة 3.قم بإنشاء هذا الإجراء في قسم Stored Procedures في قاعدة بيانات DB_Books باستخدام الأداة المساعدة SQL server Management Studio. قم بتشغيله باستخدام الأمر

EXEC Count_Books_Title 100 ، "P٪"

تحقق من النتيجة.

مثال على إنشاء إجراء باستخدام معلمات الإدخال ومعلمة الإخراج:

إنشاء الإجراء Count_Books_ItogoCount_pages INT ،Title CHAR (10) ،Itogo INT OUTPUT AS SELECTItogo = COUNT (Code_book) من الكتب حيث الصفحات> =Count_pages AND Title_book LIKETitle GO

المهمة 4.قم بإنشاء هذا الإجراء في قسم Stored Procedures في قاعدة بيانات DB_Books باستخدام الأداة المساعدة SQL server Management Studio. قم بتشغيل مجموعة من الأوامر:

Sql> Declareq كـ int EXEC Count_Books_Itogo 100 ، "P٪" ، خرجq حددq

تحقق من النتيجة.

مثال على إنشاء إجراء باستخدام معلمات الإدخال و RETURN:

قم بإنشاء اسم تحقق الإجراءparam INT AS IF (حدد Name_author من المؤلفين حيث Code_author =param) = "Pushkin A.S." العودة 1 آخر العودة 2

المهمة 5.قم بإنشاء هذا الإجراء في قسم Stored Procedures في قاعدة بيانات DB_Books باستخدام الأداة المساعدة SQL server Management Studio. قم بتشغيله باستخدام الأوامر:

DECLAREreturn_status INT EXECreturn_status = checkname 1 حدد "حالة الإرجاع" =return_status

مثال على إنشاء إجراء بدون معلمات لمضاعفة قيمة حقل مفتاح في جدول المشتريات:

إنشاء PROC update_proc كتحديث تعيين المشتريات Code_purchase = Code_purchase * 2

المهمة 6.قم بإنشاء هذا الإجراء في قسم Stored Procedures في قاعدة بيانات DB_Books باستخدام الأداة المساعدة SQL server Management Studio. قم بتشغيله باستخدام الأمر

EXEC update_proc

مثال على إجراء بمعامل إدخال للحصول على جميع المعلومات حول مؤلف معين:

إنشاء PROC select_authork CHAR (30) AS SELECT * من المؤلفين حيث name_author =k

المهمة 7.

EXEC select_author "Pushkin A.S." أو select_author @ k = "Pushkin A.S." أو EXEC select_author @ k = "Pushkin A.S."

مثال على إنشاء إجراء باستخدام معلمة إدخال وقيمة افتراضية لزيادة قيمة حقل مفتاح في جدول المشتريات بعدد محدد من المرات (مرتين افتراضيًا):

CREATE PROC update_procp INT = 2 كتحديث مجموعة المشتريات Code_purchase = Code_purchase *p

الإجراء لا يعيد أي بيانات.

المهمة 8.قم بإنشاء هذا الإجراء في قسم Stored Procedures في قاعدة بيانات DB_Books باستخدام الأداة المساعدة SQL server Management Studio. قم بتشغيله باستخدام الأوامر:

EXEC update_proc 4 أو EXEC update_procp = 4 أو EXEC update_proc - سيتم استخدام القيمة الافتراضية.

مثال على إنشاء إجراء باستخدام معلمات الإدخال والإخراج. قم بإنشاء إجراء لتحديد عدد الطلبات المنجزة خلال فترة محددة:

إنشاء PROC count_purchases @ d1 SMALLDATETIME، @ d2 SMALLDATETIME،c INT OUTPUT AS SELECT @ c = COUNT (Code_purchase) من المشتريات حيث Date_order BETWEEN @ d1 AND @ d2 SETc = ISNULL (c، 0)

المهمة 9.قم بإنشاء هذا الإجراء في قسم Stored Procedures في قاعدة بيانات DB_Books باستخدام الأداة المساعدة SQL server Management Studio. قم بتشغيله باستخدام الأوامر:

DECLARE @ C2 INT EXEC count_purchases '01 - Jun- 2006 '، '01 - jul- 2006'، @ c2 OUTPUT SELECT @ c2

متغيرات مهام العمل المخبري رقم 4

الأحكام العامة.في الأداة المساعدة SQL Server Management Studio ، قم بإنشاء صفحة جديدة للرمز (زر إنشاء استعلام). تنشيط قاعدة بيانات DB_Books التي تم إنشاؤها برمجيًا باستخدام عبارة Use. قم بإنشاء إجراءات مخزنة باستخدام عبارات إجراء إنشاء ، وحدد أسماء الإجراءات بنفسك. سيقوم كل إجراء بتنفيذ استعلام SQL واحد ، والذي تم تنفيذه في المختبر الثاني. علاوة على ذلك ، يجب تغيير كود SQL للاستعلامات بطريقة تمكنهم من تمرير قيم الحقول التي يتم البحث عنها.

على سبيل المثال ، المهمة الأصلية والاستعلام في المعمل رقم 2:

/ * حدد من دليل المورد (جدول التسليم) أسماء الشركات وأرقام الهواتف ورقم التعريف الضريبي (TIN اسم الحقول والهاتف و INN) ، واسم الشركة (Field Name_company) هو OAO MIR.

حدد Name_company ، الهاتف ، INN من عمليات التسليم حيث Name_company = "JSC MIR"

* / - في هذا العمل ، سيتم إنشاء إجراء:

إنشاء PROC select_name_companycomp CHAR (30) AS SELECT Name_company، Phone، INN FROM Deliveries WHERE Name_company =comp

- لبدء الإجراء ، استخدم الأمر:

EXEC select_name_company "JSC MIR"

قائمة المهام

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

الخيار 1

1. اعرض قائمة بالموظفين الذين لديهم طفل واحد على الأقل.

2. عرض قائمة بالأطفال الذين حصلوا على هدايا خلال الفترة المحددة.

3. اعرض قائمة بالآباء الذين لديهم أطفال قاصرون.

4. عرض معلومات حول الهدايا بقيمة أكبر من الرقم المحدد ، مرتبة حسب التاريخ.

الخيار 2

1. عرض قائمة المباريات بالنوع المحدد.

2. اعرض عدد الأجهزة التي تم إصلاحها والتكلفة الإجمالية للإصلاحات من المدير المحدد.

3. عرض قائمة أصحاب الأجهزة وعدد مراتهم ، مرتبة حسب عدد الزيارات بترتيب تنازلي.

4. عرض معلومات حول الرواد بدرجة أكبر من الرقم المحدد أو بتاريخ توظيف أقل من التاريخ المحدد.

الخيار 3

2. اعرض قائمة بأكواد المبيعات التي تم بيع الزهور من أجلها بمبلغ أكبر من الرقم المحدد.

3. اعرض تاريخ البيع والمبلغ والبائع والزهرة لكود البيع المحدد.

4. اعرض قائمة بالألوان وفرز للزهور التي يزيد ارتفاعها عن العدد المحدد أو تتفتح.

الخيار 4

1. عرض قائمة الأدوية مع الإشارة المحددة للاستخدام.

2. عرض قائمة تواريخ التسليم التي تم بيع أكثر من الرقم المحدد للدواء الذي يحمل نفس الاسم.

3. عرض تاريخ التسليم والمبلغ والاسم الكامل للمدير من المورد واسم الدواء بكود إيصال أكبر من الرقم المحدد.

الخيار 5

2. اعرض قائمة بالمعدات التي تم إيقاف تشغيلها للسبب المحدد.

3. عرض تاريخ الاستلام واسم الجهاز والاسم الكامل للشخص المسؤول وتاريخ إيقاف تشغيل المعدات التي تم إيقاف تشغيلها خلال الفترة المحددة.

4. اعرض قائمة بالمعدات من النوع المحدد أو بتاريخ استلام أكبر من قيمة معينة

الخيار 6

1. اعرض قائمة بالأطباق التي يزيد وزنها عن الرقم المحدد.

2. اعرض قائمة بالمنتجات التي تحتوي أسماؤها على جزء الكلمة المحدد.

3. عرض حجم المنتج ، واسم الطبق ، واسم المنتج مع رمز الطبق من القيمة الأولية المحددة إلى قيمة نهائية معينة.

4. اعرض ترتيب طهي الطبق واسم الطبق الذي يحتوي على كمية من الكربوهيدرات أكبر من قيمة معينة أو عدد السعرات الحرارية التي تزيد عن القيمة المحددة.

الخيار 7

1. عرض قائمة الموظفين مع الوظيفة المحددة.

3. عرض تاريخ التسجيل ونوع الوثيقة والاسم الكامل للمسجل واسم المنظمة للوثائق المسجلة خلال الفترة المحددة.

4. عرض قائمة بالوثائق المسجلة بنوع محدد من المستندات أو بتاريخ تسجيل أكبر من القيمة المحددة.

الخيار 8

1. عرض قائمة الموظفين مع تحديد سبب تركهم.

3. عرض تاريخ التسجيل وسبب الفصل والاسم الكامل للموظف للمستندات المسجلة خلال الفترة المحددة.

الخيار 9

1. عرض قائمة الموظفين الذين أخذوا إجازة من النوع المحدد.

2. عرض قائمة الوثائق مع تاريخ التسجيل خلال الفترة المحددة.

3. عرض تاريخ التسجيل ونوع الاجازة والاسم الكامل للموظف للمستندات المسجلة خلال الفترة المحددة.

4. عرض قائمة الوثائق المسجلة مع رمز الوثيقة في النطاق المحدد.

الخيار 10

1. عرض قائمة الموظفين مع الوظيفة المحددة.

2. اعرض قائمة بالمستندات التي تحتوي على جزء الكلمة المحدد.

3. عرض تاريخ التسجيل ونوع الوثيقة والاسم الكامل للمرسل واسم المنظمة للوثائق المسجلة خلال الفترة المحددة.

4. عرض قائمة المستندات المسجلة بنوع المستند المحدد أو برمز مستند أقل من قيمة معينة.

الخيار 11

1. اعرض قائمة بالموظفين المعينين في المنصب المحدد.

2. عرض قائمة الوثائق مع تاريخ التسجيل خلال الفترة المحددة.

3. عرض تاريخ التسجيل والوظيفة والاسم الكامل للموظف للوثائق المسجلة خلال الفترة المحددة.

4. عرض قائمة الوثائق المسجلة مع رمز الوثيقة في النطاق المحدد.

الخيار 12

3. اعرض قائمة بالأشخاص الذين استأجروا المعدات وعدد طلباتهم ، مرتبة حسب عدد الطلبات بترتيب تنازلي.

الخيار 13

1. اعرض قائمة المعدات بالنوع المحدد. 2. اعرض قائمة بالمعدات التي قام موظف معين بإخراجها من الخدمة.

3. عرض كمية المعدات التي تم إيقاف تشغيلها ، مجمعة حسب نوع الجهاز.

4. عرض معلومات حول الموظفين الذين لديهم تاريخ توظيف أكبر من تاريخ معين.

الخيار 14

1. اعرض قائمة الزهور بنوع الورقة المحدد.

2. اعرض قائمة بأكواد الاستلام التي تم بيع الزهور لها بمبالغ أكبر من قيمة معينة.

3. عرض تاريخ الاستلام والمبلغ وأسماء المورد وألوان رمز المورد المحدد.

4. اعرض قائمة بالزهور وفرزًا للزهور التي يزيد ارتفاعها عن رقم معين أو تتفتح.

الخيار 15

1. عرض قائمة العملاء الذين وصلوا إلى الغرف خلال الفترة المحددة.

2. عرض المبلغ الإجمالي للمدفوعات للغرف لكل عميل.

3. عرض تاريخ الوصول ونوع الغرفة والاسم الكامل للعملاء المسجلين خلال الفترة المحددة.

4. عرض قائمة العملاء المسجلين في غرف من نوع معين.

الخيار 16

1. اعرض قائمة المعدات بالنوع المحدد.

2. اعرض قائمة بالمعدات التي استأجرها عميل معين.

3. اعرض قائمة بالأشخاص الذين استأجروا المعدات وعدد طلباتهم ، مرتبة حسب عدد الطلبات بترتيب تنازلي.

4. عرض معلومات حول العملاء مرتبة حسب العناوين.

الخيار 17

1. اعرض قائمة بالأشياء الثمينة بسعر شراء أكبر من قيمة معينة أو فترة ضمان أكبر من رقم محدد.

2. اعرض قائمة بمواقع الأصول المادية ، والتي باسمها ترد الكلمة المحددة.

3. اعرض مجموع تكلفة الأشياء الثمينة برمز في النطاق المحدد.

4. عرض قائمة الأشخاص المسؤولين ماليًا مع تاريخ التوظيف في النطاق المحدد.

الخيار 18

1. اعرض قائمة بالإصلاحات التي قام بها سيد معين.

2. عرض قائمة بمراحل العمل المتضمنة في العمل والتي ترد في عنوانها الكلمة المحددة.

3. اعرض مجموع تكلفة مراحل أعمال الإصلاح للأعمال ذات الرمز في النطاق المحدد.

4. عرض قائمة الماجستير مع تاريخ التوظيف في النطاق المحدد.

الخيار 19

1. عرض قائمة الأدوية مع إشارة محددة.

2. عرض قائمة بأرقام الإيصالات التي باعت أكثر من عدد معين من الأدوية.

3. عرض تاريخ البيع والمبلغ والاسم الكامل للصراف والدواء الخاص بالإيصال مع الرقم المحدد.

4. عرض قائمة الأدوية ووحدات قياس الأدوية التي تزيد كمية العبوة عن الرقم المحدد أو رمز الدواء أقل من قيمة معينة.

الخيار 20

1. عرض قائمة الموظفين مع الوظيفة المحددة.

2. اعرض قائمة بالمستندات التي تحتوي على جزء الكلمة المحدد.

3. عرض تاريخ التسجيل ونوع الوثيقة والاسم الكامل للمنفذ وحقيقة التنفيذ للمستندات المسجلة خلال الفترة المحددة.

4. عرض قائمة الوثائق المسجلة مع نوع الوثيقة المحدد أو مع رمز الوثيقة في نطاق معين.

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

يعد موضوع هذا الفصل أحد أقوى الأدوات المقدمة لمطوري تطبيقات قاعدة بيانات InterBase لتنفيذ منطق الأعمال. تسمح لك الإجراءات المخزنة (اللغة الإنجليزية ، الإجراءات الرتيبة) بتنفيذ جزء كبير من منطق التطبيق على مستوى قاعدة البيانات وبالتالي زيادة أداء التطبيق بأكمله ، وجعل معالجة البيانات مركزية وتقليل مقدار الكود المطلوب لإنجاز المهام المطروحة تقريبًا يتطلب أي تطبيق قاعدة بيانات معقد بدرجة كافية استخدام الإجراءات المخزنة.
بالإضافة إلى هذه الفوائد المعروفة لاستخدام الإجراءات المخزنة ، الشائعة في معظم أنظمة قواعد البيانات العلائقية ، يمكن لإجراءات InterBase المخزنة أن تلعب دور مجموعات البيانات شبه الكاملة ، مما يسمح لك باستخدام النتائج التي يتم إرجاعها في استعلامات SQL العادية.
غالبًا ما يفكر المطورون المبتدئون في الإجراءات المخزنة على أنها مجرد مجموعة من استعلامات SQL المحددة التي تقوم بشيء ما داخل قاعدة البيانات ، وهناك رأي مفاده أن العمل مع الإجراءات المخزنة أصعب بكثير من تنفيذ نفس الوظيفة في تطبيق العميل ، بدرجة عالية لغة المستوى
إذن ما هي بالضبط الإجراءات المخزنة في InterBase؟
الإجراء المخزن (SP) هو جزء من البيانات الوصفية لقاعدة البيانات ، وهو عبارة عن روتين فرعي تم تجميعه في التمثيل الداخلي لـ InterBase ، مكتوبًا بلغة خاصة ، تم تضمين مترجمها في قلب خادم InteiBase
يمكن استدعاء إجراء مخزن من تطبيقات العميل ومن المشغلات ومن الإجراءات المخزنة الأخرى. يتم تنفيذ إجراء مخزن داخل عملية خادم ويمكنه معالجة البيانات الموجودة في قاعدة البيانات ، وكذلك إعادة نتائج تنفيذه إلى العميل الذي أطلق عليه (أي المشغل ، HP ، التطبيق)
أساس الميزات القوية الكامنة في HP هي لغة البرمجة الإجرائية ، والتي تتضمن كلاً من عبارات SQL العادية المعدلة ، مثل INSERT و UPDATE و SELECT ، بالإضافة إلى أدوات التفرع والتكرار (IF ، WHILE) ، بالإضافة إلى أدوات معالجة الأخطاء . والاستثناءات تسمح لك لغة الإجراءات المخزنة بتنفيذ خوارزميات معقدة للعمل مع البيانات ، وبسبب التركيز على العمل مع البيانات العلائقية ، فإن SPs أكثر إحكاما من الإجراءات المماثلة في اللغات التقليدية.
وتجدر الإشارة إلى أنه يتم استخدام نفس لغة البرمجة للمُشغلات ، باستثناء عدد من الميزات والقيود. تمت مناقشة الاختلافات بين مجموعة فرعية من اللغة المستخدمة في المشغلات ولغة HP بالتفصيل في فصل المشغلات (الجزء 1).

مثال على إجراء مخزن بسيط

حان الوقت لإنشاء أول إجراء مخزن واستخدامه كمثال لدراسة عملية إنشاء الإجراءات المخزنة. لكن أولاً ، يجب أن تُقال بضع كلمات حول كيفية العمل مع الإجراءات المخزنة ، والحقيقة هي أن HP تدين بشهرتها كأداة غامضة وغير مريحة لأدوات قياسية سيئة للغاية لتطوير الإجراءات المخزنة وتصحيحها. في وثائق InterBase ، يوصى بإنشاء إجراءات باستخدام ملفات البرنامج النصي SQL التي تحتوي على نص CP ، والتي يتم تغذيتها لمترجم isql ، وبالتالي إنشاء وتعديل CP. إذا حدث خطأ ، فسيعرض isql رسالة عليها سطر من ملف البرنامج النصي SQL حدث الخطأ. صحح الخطأ وكرر الأمر من جديد. لا تتم مناقشة التصحيح بالمعنى الحديث للكلمة ، أي تتبع التنفيذ ، مع القدرة على عرض القيم الوسيطة للمتغيرات ، على الإطلاق. من الواضح أن هذا النهج لا يساهم في نمو جاذبية الإجراءات المخزنة في نظر المطور.
ومع ذلك ، بالإضافة إلى نهج الحد الأدنى القياسي لتطوير HP<_\ществ\ют также инструменты сторонних разработчиков, которые делают работу с хранимыми процедурами весьма удобной Большинство универсальных продуктов для работы с InterBase, перечисленных в приложении "Инструменты администратора и разработчика InterBase", предоставляют удобный инструментарий для работы с ХП. Мы рекомендуем обязательно воспользоваться одним из этих инструментов для работы с хранимыми процедурами и изложение материала будем вести в предположении, что у вас имеется удобный GUI-инструмент, избавляющий от написания традиционных SQL-скриптов
يتم وصف بناء جملة الإجراءات المخزنة على النحو التالي:

إنشاء اسم الإجراء
[(نوع بيانات بارام [، نوع بيانات بارام ...])]
)]
كما
;
< procedure_body> = []
< block>
< vanable_declaration_list> =
إعلان متغير نوع بيانات var ؛

=
يبدأ
< compound_statement>
[< compound_statement> ...]
نهاية
< compound_statement> = (بيان؛)

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

إنشاء إجراء SP_Add (أول_ دقة مضاعفة ،
second_arg دقة مزدوجة)
العوائد (نتيجة الدقة المزدوجة)
كما
يبدأ
النتيجة = first_arg + second_arg ؛
تعليق؛
نهاية

كما ترى ، كل شيء بسيط: بعد الأمر CREATE PROCEDURE ، يشار إلى اسم الإجراء الذي تم إنشاؤه حديثًا (والذي يجب أن يكون فريدًا في قاعدة البيانات) - في هذه الحالة ، SP_Add ، ثم معلمات إدخال XP - first_arg و second_arg - يتم سردها بين أقواس مفصولة بفواصل - تشير إلى أنواعها.
تعد قائمة معلمات الإدخال جزءًا اختياريًا من عبارة CREATE PROCEDURE - هناك حالات عندما يتلقى الإجراء جميع البيانات الخاصة بعمله من خلال الاستعلامات إلى الجداول داخل نص الإجراء.

تستخدم الإجراءات المخزنة أي أنواع من أنواع البيانات العددية InteiBase لا يوجد استخدام للصفائف وأنواع محددة من قبل المستخدم - المجالات

بعد ذلك تأتي الكلمة الرئيسية RETURNS ، وبعد ذلك يتم إدراج معلمات الإرجاع بين قوسين ، للإشارة إلى أنواعها - في هذه الحالة ، واحدة فقط - النتيجة.
إذا لم يكن من المفترض أن يؤدي الإجراء إلى إرجاع المعلمات ، فإن كلمة RETURNS وقائمة المعلمات التي تم إرجاعها مفقودة.
يتبع RETURNSQ الكلمة الأساسية AS. قبل أن تذهب الكلمة الأساسية AS لقب،وبعدها - تكنوإجراءات.
نص الإجراء المخزن هو قائمة بإعلانات المتغيرات الداخلية (المحلية) الخاصة به (إن وجدت ، تمت مناقشتها بمزيد من التفاصيل أدناه) ، مفصولة بفاصلة منقوطة (؛) ، وكتلة من العبارات محاطة بأقواس عبارة BEGIN END. في هذه الحالة ، يكون جسم CP بسيطًا جدًا - نطلب إضافة وسيطتي إدخال وإسناد نتيجتهما إلى المخرجات ، ثم استدعاء الأمر SUSPEND. بعد ذلك بقليل سنشرح جوهر إجراء هذا الأمر ، ولكن في الوقت الحالي سنلاحظ فقط أنه من الضروري تمرير معلمات الإرجاع إلى المكان الذي تم استدعاء الإجراء المخزن منه.

فواصل في الإجراءات المخزنة

لاحظ أن العبارة الموجودة داخل الإجراء تنتهي بفاصلة منقوطة (؛). كما تعلم ، فإن الفاصلة المنقوطة هي فاصل الأوامر القياسي في SQL - إنها إشارة لمترجم SQL بأن نص الأمر قد تم إدخاله بالكامل وأنه يجب معالجته. ألن يتضح أنه ، بعد العثور على فاصلة منقوطة في منتصف SP ، سوف يعتبر مترجم SQL أن الأمر قد تم إدخاله بالكامل وسيحاول تنفيذ جزء من الإجراء المخزن؟ هذا الافتراض لا يخلو من معنى. في الواقع ، إذا أنشأت ملفًا تكتب فيه المثال أعلاه ، وأضف أمر اتصال قاعدة البيانات وحاول تنفيذ برنامج SQL النصي هذا باستخدام مترجم isql ، فسيتم إرجاع خطأ متعلق بما هو غير متوقع ، وفقًا للمترجم ، في نهاية الأمر لإنشاء إجراء مخزن. إذا قمت بإنشاء إجراءات مخزنة باستخدام ملفات نصية SQL ، دون استخدام أدوات مطور InterBase المتخصصة ، فقبل كل أمر لإنشاء CP (ينطبق الأمر نفسه على المشغلات) ، يجب عليك تغيير فاصل أوامر البرنامج النصي إلى حرف آخر غير الفاصلة المنقوطة ، وبعد ذلك نص HP استعادته مرة أخرى. يبدو الأمر isql لتغيير فاصل جملة SQL كما يلي:

اضبط المدة

بالنسبة للحالة النموذجية لإنشاء إجراء مخزن ، يبدو الأمر كما يلي:

تعيين المدة ^ ؛
إنشاء إجراء some_procedure
... . .
نهاية
^
اضبط المدة ؛ ^

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

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

تحديد*
من Sp_add (181.35 ، 23.09)

سيعيد لنا هذا الاستعلام صفًا واحدًا يحتوي على حقل نتيجة واحد فقط ، والذي سيحتوي على مجموع الأرقام 181.35 و 23.09 ، أي 204.44.
وبالتالي ، يمكن استخدام الإجراء الخاص بنا في استعلامات SQL العادية التي يتم تنفيذها في كل من برامج العميل وفي مقدمي الخدمات الآخرين أو المشغلات. أصبح هذا الاستخدام للإجراء الخاص بنا ممكنًا عن طريق استخدام الأمر SUSPEND في نهاية الإجراء المخزن.
الحقيقة هي أنه في InterBase (وفي جميع نسخه) يوجد نوعان من الإجراءات المخزنة: الإجراءات القابلة للتحديد والإجراءات القابلة للتنفيذ. يتمثل الاختلاف في كيفية عمل هذين النوعين من CPs في أن إجراءات الجلب عادةً ما تُرجع العديد من مجموعات معلمات الإخراج ، مجمعة صفًا بصف ، والتي تبدو كمجموعة بيانات ، والإجراءات القابلة للتنفيذ إما لا يمكنها إرجاع المعلمات على الإطلاق ، أو إرجاع مجموعة واحدة فقط من معلمات الإخراج المدرجة في المرتجعات ، حيث سطر واحد من المعلمات. يتم استدعاء إجراءات التحديد في استعلامات SELECT ، ويتم استدعاء الإجراءات القابلة للتنفيذ بواسطة الأمر EXECUTE PROCEDURE.
كلا النوعين من الإجراءات المخزنة لهما نفس بناء جملة الإنشاء وهما رسميًا متماثلان ، لذلك يمكن استدعاء أي إجراء قابل للتنفيذ في استعلام SELECT ويمكن استدعاء أي إجراء تحديد باستخدام EXECUTE PROCEDURE. السؤال هو كيف ستتصرف HP مع أنواع المكالمات المختلفة. بمعنى آخر ، يكمن الاختلاف في تصميم الإجراء لنوع معين من المكالمات. أي ، يتم إنشاء إجراء تحديد خصيصًا ليتم استدعاؤه من استعلام SELECT ، ويتم إنشاء إجراء قابل للتنفيذ على وجه التحديد ليتم استدعاؤه باستخدام EXECUTE PROCEDURE. لنلقِ نظرة على الاختلافات في تصميم هذين النوعين من HP.
من أجل فهم كيفية عمل إجراء الاختيار ، عليك التعمق أكثر في النظرية. دعنا نتخيل استعلام SQL عاديًا مثل معرف التحديد ، NAME FROM Table_example. نتيجة لتنفيذه ، حصلنا على جدول يتكون من عمودين (ID و NAME) وعدد معين من الصفوف (يساوي عدد الصفوف في جدول Table_example). يُطلق على الجدول الذي تم إرجاعه نتيجة لهذا الاستعلام أيضًا مجموعة بيانات SQL ، دعنا نفكر في كيفية تكوين مجموعة البيانات أثناء تنفيذ هذا الاستعلام ، بعد أن تلقى الخادم الاستعلام ، يحدد الجداول التي ينتمي إليها ، ثم يكتشف أي مجموعة فرعية من يجب تضمين السجلات من هذه الجداول في نتيجة الاستعلام. بعد ذلك ، يقرأ الخادم كل سجل يلبي نتائج الاستعلام ، ويحدد الحقول المطلوبة منه (في حالتنا ، هذه هي ID و NAME) ويرسلها إلى العميل. ثم تتكرر العملية مرة أخرى - وهكذا دواليك لكل سجل محدد.
كل هذا الاستطراد ضروري حتى يفهم القارئ العزيز أن جميع مجموعات بيانات SQL تتكون سطراً بسطر ، بما في ذلك الإجراءات المخزنة! والفرق الرئيسي بين إجراءات التحديد والإجراءات القابلة للتنفيذ هو أن الأول مصمم لإرجاع صفوف متعددة ، بينما تم تصميم الأخير لإرجاع صفوف واحدة فقط. لذلك ، يتم استخدامها بشكل مختلف: يتم استدعاء إجراء التحديد باستخدام الأمر SELECT ، والذي "يتطلب" الإجراء لإرجاع جميع السجلات التي يمكنه إرجاعها. يسمى الإجراء القابل للتنفيذ باستخدام إجراء التنفيذ ، والذي "يأخذ" سطرًا واحدًا فقط من CP ، ويتجاهل الباقي (حتى لو كان موجودًا!)
لنلقِ نظرة على مثال لإجراء التحديد لجعله أكثر وضوحًا. للتسامح ، دعنا ننشئ إجراء مخزنًا يعمل تمامًا مثل معرف التحديد ، الاسم من استعلام Table_Example ، أي أنه ببساطة يختار حقلي المعرف والاسم من الجدول بأكمله. هذا المثال:

إنشاء إجراء Simple_Select_SP
عائدات (
عدد صحيح procID ،
procNAME VARCHAR (80))
كما
يبدأ
بالنسبة
حدد المعرف ، الاسم من table_example
INTO: procID ،: procNAME
فعل
يبدأ
تعليق؛
نهاية
نهاية

دعنا نلقي نظرة على إجراءات هذا الإجراء ، المسمى Simple_Select_SP. كما ترى ، لا تحتوي على معلمات إدخال ولديها معلمتان إخراج - ID و NAME. الأكثر إثارة للاهتمام ، بالطبع ، يكمن في جسم الإجراء. يتم استخدام بناء FOR SELECT هنا:

بالنسبة
حدد المعرف ، الاسم من table_example
INTO: procID ،: procNAME
فعل
يبدأ

/ * افعل شيئًا باستخدام متغيرات procID و procName * /

نهاية

يعني هذا الجزء من التعليمات البرمجية ما يلي: لكل صف محدد من جدول Table_example ، ضع القيم المحددة في متغيرات procID و procName ، ثم نفذ بعض الإجراءات على هذه المتغيرات.
يمكنك وضع وجه متفاجئ وتسأل ، "المتغيرات؟ ما هي المتغيرات الأخرى 9؟" إنه نوع من المفاجأة في هذا الفصل أنه يمكننا استخدام المتغيرات في الإجراءات المخزنة. في XP ، يمكنك التصريح عن كل من المتغيرات المحلية الخاصة بك ضمن إجراء ، واستخدام معلمات الإدخال والإخراج كمتغيرات.
للإعلان عن متغير محلي في إجراء مخزن ، يجب أن تضع إعلانه بعد الكلمة الأساسية AS وقبل الكلمة الأولى BEGIN. يبدو إعلان المتغير المحلي على النحو التالي:

إعلان متغير ;

على سبيل المثال ، للإعلان عن عدد صحيح متغير محلي Mylnt ، يمكنك إدراج التعريف التالي بين AS و BEGIN

إعلان متغير MyInt INTEGER ؛

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

procName = "اسم ما" ؛

لكن العودة إلى جسد إجراءنا. ترجع جملة FOR SELECT البيانات ليس في شكل جدول - مجموعة بيانات ، ولكن في شكل صف واحد في كل مرة. يجب وضع كل حقل تم إرجاعه في المتغير الخاص به: ID => procID ، NAME => procName. في جزء DO ، يتم إرسال هذه المتغيرات إلى العميل الذي يسمى الإجراء p> باستخدام الأمر SUSPEND.
وبالتالي ، فإن الأمر FOR SELECT ... DO حلقات من خلال السجلات المحددة في جزء SELECT من الأمر. في جسم الحلقة التي شكلها جزء DO ، يتم نقل السجل التالي الذي تم إنشاؤه إلى العميل باستخدام الأمر SUSPEND.
لذلك ، تم تصميم إجراء الاختيار لإرجاع صف واحد أو أكثر ، حيث يتم تنظيم حلقة داخل جسم CP ، وملء المعلمات المتغيرة الناتجة. وفي نهاية نص هذه الحلقة ، يوجد أمر SUSPEND الذي سيعيد الصف التالي من البيانات إلى العميل.

الحلقات ومشغلي الفروع

بالإضافة إلى الأمر FOR SELECT ... DO ، الذي ينظم دورة من خلال سجلات تحديد معين ، هناك نوع آخر من الدورات - بينما ... DO ، والذي يسمح لك بتنظيم دورة بناءً على التحقق من أي شروط. فيما يلي مثال على HP باستخدام حلقة WHILE..DO. يقوم هذا الإجراء بإرجاع مربعات الأعداد الصحيحة من 0 إلى 99:

إنشاء PROCEDJRE QUAD
العوائد (رباعي صحيح)
كما
أعلن متغيرًا صحيحًا ؛
يبدأ
أنا = 1 ؛
عندما أنا<100) DO
يبدأ
QUADRAT = أنا * أنا ؛
أنا = أنا + 1 ؛
تعليق؛
نهاية
نهاية

نتيجة لتنفيذ استعلام SELECT FROM QUAD ، سنحصل على جدول يحتوي على عمود QUADRAT واحد ، حيث سيكون هناك مربعات من الأعداد الصحيحة من 1 إلى 99
بالإضافة إلى التكرار على نتائج استعلام SQL والحلقة الكلاسيكية ، تستخدم لغة الإجراء المخزن العبارة IF ... ثم ... ELSE ، والتي تتيح لك تنظيم التفرع اعتمادًا على تنفيذ أي \ شرط. على غرار معظم العبارات المتفرعة في لغات البرمجة عالية المستوى ، مثل باسكال وسي.
دعنا نلقي نظرة على مثال أكثر تعقيدًا لإجراء مخزن يقوم بما يلي.

  1. لحساب متوسط ​​السعر في جدول Table_example (راجع فصل "جداول المفاتيح الأساسية والمولدات")
  2. بعد ذلك ، بالنسبة لكل إدخال في الجدول ، يقوم بالتحقق التالي ، إذا كان السعر الحالي (PRICE) أكبر من متوسط ​​السعر ، ثم يحدد السعر المساوي لمتوسط ​​السعر بالإضافة إلى النسبة المئوية الثابتة المحددة
  3. إذا كان السعر الحالي أقل من متوسط ​​السعر أو مساويًا له ، فعندئذٍ يحدد السعر مساويًا للسعر السابق مضافًا إليه نصف الفرق بين السعر القديم ومتوسط ​​السعر.
  4. تُرجع جميع الصفوف التي تم تغييرها في جدول.

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

إنشاء إجراء زيادة الأسعار (
Percent2 زيادة الدقة المزدوجة)
RETURNS (ID INTEGER، NAME VARCHAR (SO)، new_price ضعف
الدقة AS

سيطلق على الإجراء اسم "زيادة الأسعار" ، ويحتوي على معلمة إدخال واحدة Peiceni21nciease ، وهي من النوع DOUBLE PRECISION ، و 3 معلمات إخراج - ID و NAME و new_pnce. لاحظ أن أول اثنين من معلمات الإخراج لهما نفس أسماء الحقول الموجودة في الجدول Table_example الذي سنعمل معه ، وهذا مسموح به بواسطة قواعد لغة الإجراء المخزن.
الآن علينا أن نعلن عن متغير محلي سيتم استخدامه لتخزين متوسط ​​القيمة. سيبدو إعلان الأنا على النحو التالي:

إعلان متغير avg_price ضعف الدقة ؛

الآن دعنا ننتقل إلى جسم الإجراء المخزن لنفتح جسم CP الكلمة الرئيسية تبدأ.
أولاً ، نحتاج إلى تنفيذ الخطوة الأولى من خوارزمية لدينا - لحساب متوسط ​​السعر. للقيام بذلك ، سوف نستخدم الاستعلام التالي:

حدد AVG (السعر_ل)
من Table_Example
إلى الداخل: متوسط ​​السعر ، -

يستخدم هذا الاستعلام دالة AVG التجميعية التي تعرض متوسط ​​قيمة الحقل PRICE_1 بين صفوف الاستعلام المحددة - في حالتنا ، متوسط ​​قيمة PRICE_1 عبر جدول Table_example بالكامل. يتم وضع القيمة التي تم إرجاعها بواسطة الاستعلام في متغير avg_price. لاحظ أن المتغير avg_pnce مسبوق بنقطتين - لتمييزه عن الحقول المستخدمة في الطلب.
تتمثل إحدى ميزات هذا الاستعلام في أنه يقوم دائمًا بإرجاع سجل واحد فقط بالضبط. تسمى هذه الاستعلامات بالاستعلامات الفردية ، ويمكن استخدام هذه التحديدات فقط في الإجراءات المخزنة. إذا أرجع الاستعلام أكثر من صف واحد ، فيجب تنسيقه على أنه بناء FOR SELECT ... DO ، الذي ينظم حلقة لمعالجة كل صف تم إرجاعه
إذن ، حصلنا على متوسط ​​قيمة السعر. أنت الآن بحاجة إلى استعراض الجدول بأكمله ، ومقارنة قيمة السعر في كل إدخال بمتوسط ​​السعر واتخاذ الإجراء المناسب.
من البداية ، ننظم التكرار لكل سجل من الجدول Table_example

بالنسبة
حدد معرّف ، NAME ، PRICE_1
من Table_Example
INTO: المعرف ،: NAME ،: new_price
فعل
يبدأ
/ * _ هنا اطلب كل سجل * /
نهاية

عند تنفيذ هذا البناء ، سيتم استرداد البيانات صفًا بصف من الجدول Table_example وسيتم تعيين قيم الحقل في كل صف إلى المتغيرات ID و NAME و new_pnce. بالطبع ، تتذكر أنه تم الإعلان عن هذه المتغيرات كمعلمات إخراج ، ولكن لا داعي للقلق من إعادة البيانات المحددة كنتائج: حقيقة أن معلمات الإخراج قد تم تعيينها شيئًا لا يعني أن العميل الذي يتصل بـ HP سيتلقى على الفور هذه القيم.! يتم تمرير المعلمات فقط عند تنفيذ الأمر SUSPEND ، وقبل ذلك يمكننا استخدام معلمات الإخراج كمتغيرات عادية - في مثالنا ، نقوم بذلك باستخدام المعامل new_price.
لذلك ، داخل جسم حلقة BEGIN .. .END ، يمكننا معالجة قيم كل صف. كما تتذكر ، نحتاج إلى معرفة كيفية مقارنة السعر الحالي بالمتوسط ​​، واتخاذ الإجراء المناسب. نقوم بتنفيذ إجراء المقارنة هذا باستخدام عبارة IF:

إذا (new_price> avg_price) ثم / * إذا كان السعر الحالي أكبر من متوسط ​​السعر * /
يبدأ
/ * ثم حدد سعرًا جديدًا يساوي متوسط ​​السعر مضافًا إليه نسبة مئوية ثابتة * /
new_price = (avg_price + avg_price * (Percent2Increase / 100)) ؛
تحديث Table_example
اضبط PRICE_1 =: new_price
أين المعرف =: المعرف ؛
نهاية
آخر
يبدأ
/ * إذا كان السعر الحالي أقل من متوسط ​​السعر أو مساويًا له ، فقم بتعيين السعر مساويًا للسعر السابق مضافًا إليه نصف الفرق بين السعر القديم ومتوسط ​​السعر * /
new_price = (new_pnce + ((avg_pnce new_price) / 2)) ؛
تحديث Table_example
اضبط PRICE_1 =: new_price
حيث المعرف = .ID ؛
نهاية

كما ترى ، حصلنا على بنية IF كبيرة إلى حد ما ، والتي سيكون من الصعب فهمها إذا لم تكن للتعليقات المضمنة في / ** / الأحرف.
من أجل تغيير السعر وفقًا للفرق المحسوب ، سنستخدم بيان UPDATE ، الذي يسمح لك بتعديل السجلات الموجودة - واحد أو أكثر. للإشارة بشكل لا لبس فيه إلى السجل الذي يجب تغيير السعر فيه ، نستخدم حقل المفتاح الأساسي في جملة WHERE ، لمقارنته بقيمة المتغير الذي يخزن قيمة المعرف للسجل الحالي: ID =: ID. لاحظ أن متغير المعرف يسبقه نقطتان.
بعد تنفيذ IF ... ثم ... ELSE ، تحتوي متغيرات ID و NAME ومتغيرات السعر الجديد على البيانات التي يجب أن نعيدها إلى العميل \ الذي استدعى الإجراء. للقيام بذلك ، بعد IF ، تحتاج إلى إدخال الأمر SUSPEND ، والذي سيرسل البيانات إلى المكان الذي تم الاتصال منه بـ CP. طوال مدة النقل ، سيتم تعليق الإجراء ، وعندما يكون هناك حاجة لتسجيل جديد من CP ، ستستمر مرة أخرى - وسيستمر هذا حتى FOR SELECT ... لن تقوم DO بالتكرار خلال جميع سجلات استعلامها.
وتجدر الإشارة إلى أنه بالإضافة إلى الأمر SUSPEND ، الذي يقوم فقط بتعليق الإجراء المخزن ، يوجد أمر EXIT ، والذي ينهي الإجراء المخزن بعد تمرير السلسلة. ومع ذلك ، نادرًا ما يتم استخدام الأمر EXIT ، نظرًا لأنه ضروري بشكل أساسي لكسر الحلقة عند الوصول إلى حالة معينة.
في هذه الحالة ، عندما يتم استدعاء الإجراء بواسطة عبارة SELECT وإنهائه بواسطة EXIT ، لن يتم إرجاع آخر صف تم استرداده. أي ، إذا كنت بحاجة إلى مقاطعة الإجراء وما زلت> تحصل على هذا الخط ، فأنت بحاجة إلى استخدام التسلسل

تعليق؛
خروج؛

الغرض الرئيسي من EXIT هو الحصول على مجموعات بيانات فردية ، وإرجاع المعلمات عن طريق الاتصال من خلال EXECUTE PROCEDURE. في هذه الحالة ، يتم تعيين قيم معلمات الإخراج ، ولكن لا يتم تشكيل مجموعة بيانات SQL منها ، وينتهي الإجراء.
دعنا نكتب نص الإجراء المخزن بالكامل حتى نتمكن من التقاط منطقه في لمحة:

إنشاء إجراء زيادة الأسعار (
Percent2 زيادة الدقة المزدوجة)
العوائد (رقم التعريف الصحيح ، الاسم فاركار (80) ،
new_price ضعف الدقة) AS
إعلان متغير avg_price ضعف الدقة ؛
يبدأ
حدد AVG (السعر_ل)
من Table_Example
INTO: متوسط ​​السعر ؛
بالنسبة
حدد معرّف ، NAME ، PRICE_1
من Table_Example
INTO: المعرف ،: NAME ،: new_price
فعل
يبدأ
/ * نقوم بمعالجة كل سجل هنا * /
إذا (new_pnce> avg_price) ثم / * إذا كان السعر الحالي أكبر من متوسط ​​السعر * /
يبدأ
/ * ضع سعرًا جديدًا يساوي متوسط ​​السعر مضافًا إليه نسبة مئوية ثابتة * /
new_price = (avg_price + avg_price * (Percent2Increase / 100)) ؛
تحديث Table_example
اضبط PRICE_1 =: new_price
أين المعرف =: المعرف ؛
نهاية
آخر
يبدأ
/ * إذا كان السعر الحالي أقل من متوسط ​​السعر أو مساويًا له ، فعندئذٍ يحدد السعر المساوي للسعر السابق مضافًا إليه نصف الفرق بين السعر القديم ومتوسط ​​السعر * /
new_price = (new_price + ((avg_price - new_price) / 2)) ؛
تحديث Table_example
اضبط PRICE_1 =: new_price
أين المعرف =: المعرف ؛
نهاية
تعليق؛
نهاية
نهاية

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

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

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

بضائع
- الأجهزة
- ثلاجات
- ثلاث غرف
- غرفتين
- غرفة واحدة
- غسالة ملابس
- رأسي
- أمامي
- كلاسيك
- ضيق
- تكنولوجيا الكمبيوتر
....

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

الغسالات - عمودية
الغسالات - فرونتال كلاسيك
الغسالات - أمامي ضيق

دعنا نحدد بنية الجداول لتخزين المعلومات في دليل المنتج. نستخدم مخططًا مبسطًا لتنظيم شجرة في جدول واحد:

إنشاء شجرة السلع الجدول
(ID_GOOD INTEGER ليس فارغًا ،
ID_PARENT_GOOD INTEGER ،
GOOD_NAME VARCHAR (80) ،
قيد المفتاح الأساسي pkGooci (ID_GOOD)) ؛

نقوم بإنشاء جدول GoodsTree واحد ، يحتوي على 3 حقول فقط: ID_GOOD هو معرف الفئة الذكية ، ID_PARENT_GOOD هو معرف الشجرة الأصل للفئة لهذه الفئة ، و GOOD_NAME هو اسم الفئة. لضمان سلامة البيانات في هذا الجدول ، سنفرض قيد مفتاح خارجي على هذا الجدول:

تبديل البضائع الجدولشجرة
أضف القيد FK_goodstree
مفتاح خارجي (ID_PARENT_GOOD)
المراجع GOODSTPEE (ID_GOOD)

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

ID_GOOD

1
2
3
4
5
6
7
8
9
10
11
12

ID_PARENT_GOOD

0
1
1
2
2
4
4
4
5
5
10
10

اسم جيد

بضائع
الأجهزة
أجهزة الكمبيوتر وملحقاتها
ثلاجات
غسالة ملابس
ثلاث غرف
غرفة مزدوجة
غرفة واحدة
عمودي
أمامي
ضيق
كلاسيك

الآن بعد أن أصبح لدينا مكان لتخزين البيانات ، يمكننا البدء في إنشاء إجراء مخزن يعرض جميع فئات المنتجات "النهائية" في نموذج "موسع" - على سبيل المثال ، للفئة "ثلاثية الغرف" الاسم الكامل لـ الفئة ستبدو مثل "ثلاجات الأجهزة المنزلية ثلاث غرف".
طورت الإجراءات المخزنة التي تعالج هياكل الشجرة المصطلحات الخاصة بها. كل عنصر من عناصر الشجرة يسمى عقدة ؛ وتسمى العلاقة بين العقد التي تشير إلى بعضها البعض علاقة الوالدين والطفل. العقد التي تقع في نهاية الشجرة وليس لها أطفال تسمى "أوراق".
سيكون لإجرائنا المخزن معرف فئة كمدخل ، سنحتاج منه لبدء التنقل لأسفل. سيبدو الإجراء المخزن على النحو التالي:

إنشاء إجراء GETFULLNAME (ID_GOOD2SHOW INTEGER)
العوائد (FULL_GOODS_NAME VARCHAR (1000) ،
ID_CHILD_GOOD INTEGER)
كما
DECLARE VARIABLE CURR_CHILD_NAME VARCHAR (80) ،
يبدأ
/ * 0 نظّم حلقة FOR SELECT الخارجية على المتحدرين المباشرين للمنتج باستخدام ID_GOOD = ID_GOOD2SHOW * /
لـ SELECT gtl.id_good، gtl.good_name
من GoodsTree gtl
أين gtl.id_parent_good =: ID_good2show
INTO: ID_CHILD_GOOD،: full_goods_name
فعل
يبدأ
/ "تحقق من الدالة EXISTS ، التي تُرجع TRUE إذا كان الاستعلام الموجود بين قوسين يُرجع صفًا واحدًا على الأقل. إذا كانت العقدة التي تم العثور عليها مع ID_PARENT_GOOD = ID_CHILD_GOOD لا تحتوي على توابع ، فهي" جزء "من الشجرة ويتم إدخالها في النتائج * /
إذا (ليس خارجًا (
حدد * من GoodsTree
أين GoodsTree.id_parent_good =: id_child_good))
ومن بعد
يبدأ
/ * مرر "ورقة" الشجرة إلى النتائج * /
تعليق؛
نهاية
آخر
/ * للعقد التي لديها أطفال * /
يبدأ
/ * تخزين اسم العقدة الأصل في متغير مؤقت * /
CURR_CHILD_NAME = full_goods_name ؛
/ * قم بتشغيل هذا الإجراء بشكل متكرر * /
بالنسبة
حدد ID_CHILD_GOOD ، full_goods_name
من GETFULLNAME (: ID_CHILD_GOOD)
INTO: ID_CHILD_GOOD،: full_goods_name
ابدأ
/ * أضف اسم العقدة الأصل إلى. ، اسم الطفل باستخدام عملية سلسلة السلسلة || * /
full_goods_name = CURR_CHILD_NAME | "" | و ull_goods_name ، -
تعليق؛ / * إرجاع الاسم الكامل للمنتج * /
نهاية
نهاية
نهاية
نهاية

إذا قمنا بتنفيذ هذا الإجراء باستخدام معامل الإدخال ID_GOOD2SHOW = 1 ، فسنحصل على ما يلي:

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

خاتمة

بهذا نختتم مراجعتنا للسمات الرئيسية للغة الإجراء المخزن. من الواضح أنه من المستحيل إتقان تطوير الإجراءات المخزنة بشكل كامل في فصل واحد ، لكننا هنا حاولنا تقديم وشرح المفاهيم الرئيسية المرتبطة بالإجراءات المخزنة. يمكن تطبيق تصاميم HP الموصوفة وتقنيات التصميم في معظم تطبيقات قواعد البيانات.
سيتم تناول بعض المشكلات المهمة المتعلقة بتطوير الإجراءات المخزنة في الفصل التالي - "ملحقات لغة الإجراء المخزن InterBase" ، والمخصص لمعالجة الاستثناءات ومعالجة الأخطاء في الإجراءات المخزنة والعمل مع المصفوفات.

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


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

الخطوة 1. إنشاء قاعدة البيانات.
للتجربة ، دعنا ننشئ قاعدة بيانات منفصلة.

إنشاء قاعدة بيانات test_sp_perf
تشغيل (NAME = "test_data"، FILENAME = "c: \ temp \ test_data"، SIZE = 1، MAXSIZE = 10، FILEGROWTH = 1Mb)
تسجيل الدخول (NAME = "test_log"، FILENAME = "c: \ temp \ test_log"، SIZE = 1، MAXSIZE = 10، FILEGROWTH = 1Mb)

الخطوة 2.إنشاء الجدول.
إنشاء جدول sp_perf_test (العمود 1 كثافة العمليات ، العمود 2 حرف (5000))

الخطوه 3.ملء الجدول بسلاسل الاختبار. يتم إضافة الصفوف المكررة إلى الجدول عن قصد. 10000 سطر بأرقام من 1 إلى 10000 ، و 10000 سطر بأرقام 50000.

إعلانi int
ضبط @ i = 1
عندما أنا<10000)
يبدأ
INSERT INTO sp_perf_test (عمود 1 ، عمود 2) VALUES (i، "سلسلة اختبار #" + CAST (i as char (8)))
INSERT INTO sp_perf_test (العمود 1 ، العمود 2) VALUES (50000، "سلسلة اختبار #" + CAST (i as char (8)))
ضبط @ i = @ i + 1
نهاية

حدد عددًا (*) من sp_perf_test
اذهب

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

إنشاء الفهرس غير المصنف CL_perf_test في sp_perf_test (العمود 1)
اذهب

الخطوة 5.قم بإنشاء إجراء مخزن. الإجراء ببساطة ينفذ عبارة SELECT مع الشرط.

إنشاء PROC proc1 (paramint)
كما
حدد العمود 1 ، العمود 2 من sp_perf_test أين [بريد إلكتروني محمي]
اذهب

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

EXEC proc1 1234
اذهب

الخطوة 7.تشغيل إجراء مخزن بمعامل غير انتقائي. يتم استخدام القيمة 50000 كمعامل. الصفوف التي تحتوي على قيمة عمود أول تبلغ حوالي 10000 ، على التوالي ، باستخدام فهرس غير مجمع وعملية البحث عن الإشارة المرجعية غير فعالة ، ولكن نظرًا لأن الكود المترجم مع خطة التنفيذ يتم تخزينه في الإجراء ذاكرة التخزين المؤقت ، سيتم استخدامه. توضح خطة التنفيذ ذلك ، بالإضافة إلى حقيقة أن عملية البحث عن الإشارة المرجعية قد تم إجراؤها لـ 9999 صفًا.

EXEC proc1 50000
اذهب

الخطوة 8.تنفيذ مجموعة من الصفوف بالحقل الأول يساوي 50000. عند تنفيذ استعلام منفصل ، يتم تحسين الاستعلام وتصنيفه بقيمة محددة للعمود الأول. نتيجة لذلك ، يحدد مُحسِّن الاستعلام أن الحقل يتكرر عدة مرات ويقرر استخدام عملية فحص الجدول ، والتي تكون في هذه الحالة أكثر فاعلية من استخدام فهرس غير مجمع.

حدد العمود 1 ، العمود 2 من sp_perf_test حيث العمود 1 = 50000
اذهب

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