أنواع إجراءات SQL المخزنة. الإجراءات المخزنة في T-SQL - إنشاء وتعديل وحذف. كيفية تنفيذ إجراء مخزن في SQL

23.11.2020

في Microsoft SQL Server ، لتنفيذ وأتمتة الخوارزميات الخاصة به ( العمليات الحسابية) ، يمكنك استخدام الإجراءات المخزنة ، لذلك سنتحدث اليوم عن كيفية إنشائها وتعديلها وحذفها.

لكن أولاً ، القليل من النظرية حتى تفهم ماهية الإجراءات المخزنة وما الغرض منها في T-SQL.

ملحوظة! للمبرمجين المبتدئين ، أوصي بالمواد المفيدة التالية حول موضوع T-SQL:

  • للحصول على دراسة أكثر تفصيلاً للغة T-SQL ، أوصي أيضًا بقراءة الكتاب - طريقة مبرمج T-SQL. برنامج تعليمي للغة Transact-SQL.

ما هي الإجراءات المخزنة في T-SQL؟

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

لتشغيل إجراء مخزن في SQL Server ، من الضروري كتابة الأمر EXECUTE قبل اسمه ، أو يكون أمر EXEC المختصر ممكنًا أيضًا. استدعاء إجراء مخزن في جملة SELECT ، على سبيل المثال ، لأن الوظيفة لن تعمل بعد الآن ، أي يتم تشغيل الإجراءات بشكل منفصل.

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

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

تعتبر الإجراءات المخزنة مفيدة للغاية ، فهي تساعدنا على أتمتة أو تبسيط العديد من العمليات ، على سبيل المثال ، تحتاج باستمرار إلى إنشاء العديد من التقارير التحليلية المعقدة باستخدام الجداول المحورية ، أي مشغل PIVOT. لتسهيل تكوين الاستعلامات باستخدام عامل التشغيل هذا ( كما تعلم ، فإن بناء جملة PIVOT معقد نوعًا ما) ، يمكنك كتابة إجراء من شأنه إنشاء تقارير موجزة ديناميكيًا ، على سبيل المثال ، في المادة "Dynamic PIVOT in T-SQL" مثال على كيفية تنفيذ هذه الميزة في شكل إجراء مخزن.

أمثلة على العمل مع الإجراءات المخزنة في Microsoft SQL Server

البيانات الأولية للحصول على أمثلة

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

بيان لإنشاء جدول إنشاء جدول الاختبار (INT IDENTITY (1،1) NOT NULL، INT NULL، VARCHAR (100) NOT NULL، MONEY NULL) GO - تعليمات لإضافة البيانات INSERT INTO TestTable (CategoryId، ProductName، Price) VALUES (1، "Mouse"، 100)، (1، "Keyboard"، 200)، (2، "Phone"، 400) انتقال - تحديد الطلب تحديد * من TestTable


البيانات موجودة ، فلننتقل الآن إلى إنشاء الإجراءات المخزنة.

إنشاء إجراء مخزّن في T-SQL - إنشاء بيان الإجراء

يتم إنشاء الإجراءات المخزنة باستخدام العبارة إنشاء الإجراء، بعد هذه التعليمات ، يجب عليك كتابة اسم الإجراء الخاص بك ، ثم ، إذا لزم الأمر ، حدد معلمات الإدخال والإخراج بين قوسين. بعد ذلك ، تكتب الكلمة الأساسية AS وتفتح كتلة التعليمات بالكلمة الأساسية BEGIN ، وأغلق هذه الكتلة بكلمة END. داخل هذه الكتلة ، تكتب جميع التعليمات التي تنفذ الخوارزمية الخاصة بك أو نوعًا من الحساب المتسلسل ، وبعبارة أخرى ، تقوم بالبرمجة في T-SQL.

على سبيل المثال ، دعنا نكتب إجراء مخزن سيضيف دخول جديد، بمعنى آخر. منتج جديد إلى مخطط الاختبار لدينا. للقيام بذلك ، سنحدد ثلاث معلمات واردة:CategoryId - معرف فئة المنتج ،ProductName - اسم المنتج و @ السعر - سعر المنتج ، ستكون هذه المعلمة اختيارية ، أي لن يكون من الممكن تمريره إلى الإجراء ( على سبيل المثال ، لا نعرف السعر بعد) ، لهذا في تعريفه سنقوم بتعيين القيمة الافتراضية. هذه المعلمات موجودة في نص الإجراء ، أي في مجموعة BEGIN ... END ، يمكنك استخدام نفس طريقة استخدام المتغيرات العادية ( كما تعلم ، يتم الإشارة إلى المتغيرات بواسطة @). إذا كنت بحاجة إلى تحديد معلمات الإخراج ، فبعد اسم المعلمة ، حدد الكلمة الأساسية OUTPUT ( أو يختصر OUT).

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

هذا هو رمز هذا الإجراء ( أنا أيضا علقت على ذلك).

قم بإنشاء إجراء إنشاء الإجراء TestProcedure (- معلمات الإدخالCategoryId INT، @ ProductName VARCHAR (100)،Price MONEY = 0) AS BEGIN - التعليمات التي تنفذ الخوارزمية الخاصة بك - معالجة المعلمات الواردة - حذف المسافات الزائدة في البداية وفي نهاية سطر النص SETProductName = LTRIM (RTRIM (ProductName)) ؛ - إضافة سجل جديد INSERT INTO TestTable (CategoryId، ProductName، Price) VALUES (CategoryId،ProductName،Price) - قم بإرجاع البيانات حدد * من TestTable حيث CategoryId =CategoryId END GO


تشغيل إجراء مخزّن في T-SQL - أمر التنفيذ

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

لا يلزم تحديد المعلمات التي تحتوي على قيم افتراضية ، فهذه تُسمى المعلمات الاختيارية.

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

1. قم باستدعاء الإجراء بدون تحديد السعر EXECUTE TestProcedureCategoryId = 1،ProductName = "Test product 1" --2. نقوم باستدعاء الإجراء بمؤشر السعر EXEC TestProcedureCategoryId = 1،ProductName = "Test product 2"، @ Price = 300 --3. نقوم باستدعاء الإجراء بدون تحديد اسم معلمات EXEC TestProcedure 1 ، "Test Product 3" ، 400


تغيير إجراء مخزن إلى T-SQL - عبارة ALTER PROCEDURE

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

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

نقوم بتغيير إجراء اختبار ALTER PROCEDURE (- المعلمات الواردةCategoryId INT،ProductName VARCHAR (100)، @ Price MONEY) كما تبدأ - التعليمات التي تنفذ الخوارزمية الخاصة بك - معالجة معلمات الإدخال - إزالة المسافات الزائدة في البداية وفي نهاية سطور النص SETProductName = LTRIM (RTRIM (ProductName)) ؛ --إضافة INSERT INTO TestTable جديد (CategoryId ، ProductName ، Price) VALUES (CategoryId،ProductName،Price) سجل END GO

إسقاط إجراء مخزّن T-SQL - بيان إجراء الإسقاط

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

على سبيل المثال ، دعنا نحذف إجراء الاختبار الذي أنشأناه.

إجراء اختبار السقوط

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

لدي كل شيء ، أتمنى أن تكون المادة ممتعة ومفيدة لك ، حتى الآن!

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


عند تجميع الإجراءات المخزنة في 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 (param int)
كما
حدد العمود 1 ، العمود 2 من sp_perf_test أين [بريد إلكتروني محمي]
يذهب

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

EXEC proc1 1234
يذهب

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

EXEC proc1 50،000
يذهب

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

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

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

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

مفهوم الإجراء المخزن

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

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

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

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

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

الإجراءات المخزنة في بيئة MS SQL Server

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

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

هناك عدة أنواع في SQL Server الإجراءات المخزنة.

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

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

خلق الإجراء المخزنيتضمن حل المهام التالية:

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

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

<определение_процедуры>:: = (CREATE | ALTER) PROC Procedure_name [؛ number] [(@ parameter_name datatype) [= افتراضي]] [، ... n] AS sql_operator [... n]

دعونا ننظر في معلمات هذا الأمر.

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

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

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

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

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

يتم استخدام الكلمة الأساسية VARYING بالاقتران مع معلمة الإخراج من النوع CURSOR. يقرر ذلك معلمة الإخراجسيكون هناك مجموعة النتائج.

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

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

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

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

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

حذف إجراء مخزننفذها الأمر:

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

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

ل تنفيذ إجراء مخزنيتم استخدام الأمر:

[[EXEC [UTE] اسم_إجراء [؛ رقم] [[@ اسم_المعامل =] (قيمة | @ اسم_متغير) |] [، ... n]

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

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

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

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

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

مثال 12.1. إجراء بدون معلمات... طور إجراءً للحصول على أسماء وقيم البضائع التي اشتراها إيفانوف.

أنشئ PROC my_proc1 AS SELECT Product.Name، Product.Price * Deal.Quantity AS Cost، Client.S from Client INNER JOIN (Product INNER JOIN Deal ON Product.Product Code = Deal.Product Code) على Client.Client Code = Deal. رمز العميل حيث العميل. مثال 12.1. الإجراء الخاص بالحصول على أسماء وقيم البضائع التي اشتراها إيفانوف.

ل الإحالات إلى الإجراءيمكنك استخدام الأوامر:

EXEC my_proc1 أو my_proc1

يقوم الإجراء بإرجاع مجموعة بيانات.

مثال 12.2. إجراء بدون معلمات... قم بإنشاء إجراء لخفض سعر منتج من الدرجة الأولى بنسبة 10٪.

ل الإحالات إلى الإجراءيمكنك استخدام الأوامر:

EXEC my_proc2 أو my_proc2

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

مثال 12.3. إجراء مع معلمة إدخال... قم بإنشاء إجراء للحصول على أسماء وأسعار البضائع التي اشتراها عميل معين.

إنشاء PROC my_proc3k VARCHAR (20) AS SELECT Commodity.Name، Commodity.Price * Deal.Quantity AS Cost، Client.S للأسماء من Client INNER JOIN (Commodity INNER JOIN Deal ON Commodity.Product Code = Deal.Product Code) على العميل .Client Code = Deal.Clientcode WHERE Customer.Lastname [بريد إلكتروني محمي] مثال 12.3. الإجراء الخاص بالحصول على أسماء وقيم البضائع المشتراة من قبل عميل معين.

ل الإحالات إلى الإجراءيمكنك استخدام الأوامر:

EXEC my_proc3 "Ivanov" أو my_proc3 @ k = "Ivanov"

مثال 12.4.... قم بإنشاء إجراء لخفض سعر نوع معين من المنتجات وفقًا للنسبة المئوية المحددة.

ل الإحالات إلى الإجراءيمكنك استخدام الأوامر:

EXEC my_proc4 "Waffles" ، 0.05 أو EXEC my_proc4 @ t = "Waffles"، @ p = 0.05

مثال 12.5. الإجراء مع معلمات الإدخالوالقيم الافتراضية. قم بإنشاء إجراء لخفض سعر نوع معين من المنتجات وفقًا للنسبة المئوية المحددة.

إنشاء عملية الشراء my_proc5t VARCHAR (20) = 'Candy'،p FLOAT = 0.1 AS UPDATE Product SET Price = السعر * ( [بريد إلكتروني محمي]) أين النوع [بريد إلكتروني محمي] مثال 12.5. إجراء مع معلمات الإدخال والقيم الافتراضية. قم بإنشاء إجراء لخفض سعر نوع معين من المنتجات وفقًا للنسبة المئوية المحددة.

ل الإحالات إلى الإجراءيمكنك استخدام الأوامر:

EXEC my_proc5 "Waffles" أو 0.05 أو EXEC my_proc5 @ t = "Waffles" أو @ p = 0.05 أو EXEC my_proc5 @ p = 0.05

في هذه الحالة ، ينخفض ​​سعر الحلويات (لا يتم تحديد قيمة النوع عند استدعاء الإجراء ويتم اتخاذها افتراضيًا).

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

مثال 12.6. الإجراء مع معلمات الإدخال والإخراج... قم بإنشاء إجراء لتحديد القيمة الإجمالية للأصناف المباعة في شهر معين.

إنشاء PROC my_proc6m INT،s FLOAT OUTPUT AS SELECT @ s = Sum (Item.Price * Deal.Quantity) من Item INNER JOIN Deal ON Commodity.Product Code = Deal.Product Code GROUP by Month (Deal.Date) HAVING الشهر (تاريخ الصفقة) [بريد إلكتروني محمي] مثال 12.6. الإجراء مع معلمات الإدخال والإخراج. قم بإنشاء إجراء لتحديد القيمة الإجمالية للأصناف المباعة في شهر معين.

ل الإحالات إلى الإجراءيمكنك استخدام الأوامر:

إعلانst FLOAT EXEC my_proc6 1 ، @ st OUTPUT SELECTst

تسمح لك كتلة الأوامر هذه بتحديد تكلفة البضائع المباعة في يناير ( معلمة الإدخاليتم تحديد الشهر على أنه 1).

قم بإنشاء إجراء لتحديد إجمالي عدد السلع المشتراة من قبل الشركة التي يعمل فيها موظف معين.

أولاً ، سنطور إجراءً لتحديد الشركة التي يعمل فيها الموظف.

مثال 12.7.إستعمال إجراءات متداخلة... قم بإنشاء إجراء لتحديد إجمالي عدد السلع المشتراة من قبل الشركة التي يعمل فيها موظف معين.

ثم سننشئ إجراءً يحسب المبلغ الإجمالي للبضائع التي تم شراؤها من قبل الشركة التي تهمنا.

CREATE PROC my_proc8fam VARCHAR (20)،kol INT OUTPUT AS DECLAREfirm VARCHAR (20) EXEC my_proc7 @ fam، @ firm OUTPUT SELECT @ kol = Sum (Deal.Number) FROM Client INNER JOIN Deal on Client.Client code = Deal.Client Code GROUP BY Client.Firm لديها Client.Firm [بريد إلكتروني محمي] مثال 12.7. إنشاء إجراء لتحديد إجمالي عدد السلع المشتراة من قبل الشركة التي يعمل فيها موظف معين.

يسمى الإجراء باستخدام الأمر:

إعلانk INT EXEC my_proc8 "Ivanov"، @ k OUTPUT SELECTk

إعلان الإجراء

إنشاء الإجراء [({في | خارج | INOUT} [,…])]
[مجموعة النتائج الديناميكية ]
يبدأ [الذري]

نهاية

الكلمات الدالة
... IN (الإدخال) - معلمة الإدخال
... OUT (الإخراج) - معلمة الإخراج
... INOUT - المدخلات والمخرجات ، وكذلك الحقل (بدون معلمات)
... تشير DYNAMIC RESULT SET إلى أن الإجراء يمكن أن يفتح العدد المحدد من المؤشرات ، والتي ستبقى مفتوحة بعد العودة من الإجراء

ملاحظاتتصحيح
لا يوصى باستخدام العديد من المعلمات في الإجراءات المخزنة (بشكل أساسي الأرقام الكبيرة وسلاسل الأحرف) بسبب الحمل الزائد للشبكة والمكدس. من الناحية العملية ، في اللهجات الحالية لـ Transact-SQL و PL / SQL و Informix ، هناك اختلاف كبير عن المعيار ، في كل من إعلان واستخدام المعلمات ، وإعلان المتغيرات ، وفي استدعاء الإجراءات الفرعية. توصي Microsoft باستخدام التقريب التالي لتقدير حجم ذاكرة التخزين المؤقت للإجراءات المخزنة:
= (الحد الأقصى لعدد المستخدمين المتزامنين) * (حجم أكبر خطة تنفيذ) * 1.25. يمكن تحديد حجم خطة التنفيذ في الصفحات باستخدام الأمر: DBCC MEMUSAGE.

استدعاء الإجراء

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

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

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

مثال على إعلان الإجراء

إنشاء إجراء Proc1 AS // إعلان إجراء
إعلان Cur1 CURSOR لتحديد الاسم ، المدينة من مندوبي المبيعات حيث التصنيف> 200 // أعلن المؤشر
فتح Cur1 // فتح المؤشر
إحضار التالي من Cur1 // قراءة البيانات من المؤشر
بينماFetch_Status = 0
يبدأ
إحضار التالي من Cur1
نهاية
CLOSE Cur1 // أغلق المؤشر
تحديد Cur1
EXECUTE Proc1 // قم بتشغيل الإجراء

تعدد الأشكال
يمكن إنشاء روتين فرعيين بنفس الاسم في نفس المخطط إذا كانت معلمات الإجراءين الفرعيين مختلفة تمامًا عن بعضها البعض بحيث يمكن تمييزها. للتمييز بين روتين فرعيين لهما نفس الاسم في نفس المخطط ، يتم إعطاء كل منهما اسمًا بديلاً وفريدًا (اسم محدد). يمكن تحديد هذا الاسم بشكل صريح عند تحديد إجراء فرعي. عند استدعاء الإجراءات الفرعية في وجود عدة أسماء متطابقة ، يتم تنفيذ تعريف الإجراء الفرعي المطلوب في عدة خطوات:
... في البداية ، يتم تحديد جميع الإجراءات بالاسم المحدد ، وإذا لم يكن هناك أي منها ، فسيتم تحديد جميع الوظائف بالاسم المحدد.
... لمزيد من التحليل ، يتم ترك تلك الإجراءات الفرعية فقط فيما يتعلق بها مستخدم معينلديه امتياز التنفيذ (EXECUTE).
... بالنسبة لهم ، يتم تحديد تلك التي يتوافق عدد المعلمات مع عدد وسيطات الاستدعاء. التحقق أنواع محددةالمعلمات ومواقفها.
... إذا كان هناك أكثر من روتين فرعي متبقي ، فسيتم تحديد الإجراء ذي الاسم الأقصر للمؤهلات.
في الممارسة العملية ، في Oracle ، يتم دعم تعدد الأشكال للوظائف المعلنة في الحزمة فقط ، [بريد إلكتروني محمي]- في مخططات مختلفة ، ويحظر التحميل الزائد في Sybase و MS SQL Server.

إزالة وتعديل الإجراءات
لحذف إجراء ، استخدم عامل التشغيل:

لتغيير الإجراء ، استخدم عامل التشغيل:

تغيير الإجراء [([{في | خارج | INOUT}])]
يبدأ [الذري]

نهاية

امتيازات الإجراء

تشغيل المنحة إلى |عام [مع خيار المنحة]

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

SQL - الدرس 15. الإجراءات المخزنة. الجزء 1.

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

إنشاء إجراء sp_name (المعلمات) تبدأ عبارات النهاية

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

أدخل العملاء (الاسم والبريد الإلكتروني) القيمة ("إيفانوف سيرجي" ، " [بريد إلكتروني محمي]");

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

CREATE PROCEDURE ins_cust (n CHAR (50)، e CHAR (50)) ابدأ الإدراج في قيمة العملاء (الاسم والبريد الإلكتروني) (n ، e) ؛ نهاية

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

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

CREATE PROCEDURE ins_cust (n CHAR (50)، e CHAR (50)) ابدأ الإدراج في قيمة العملاء (الاسم والبريد الإلكتروني) (n ، e) ؛ نهاية //


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

call ins_cust ("Valery Sychov"، " [بريد إلكتروني محمي]")//


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

ظهر ، الإجراء يعمل ، وسيعمل دائمًا حتى نحذفه باستخدام عامل التشغيل إجراء DROP PROCEDURE الداخلي_اسم.

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

يبدو أن أسهل طريقة هي أخذ العرض وطلبه المكتوب بالفعل في الدرس 11 ، ودمجها في إجراء مخزن وجعل معرّف البائع (id_vendor) معلمة إدخال ، مثل هذا:

إنشاء الإجراء sum_vendor (i INT) ابدأ إنشاء عرض report_vendor AS SELECT magazine_incoming.id_product، magazine_incoming.quantity، prices.price، magazine_incoming.quantity * prices.price as abstract from magazine_incoming، الأسعار WHEREcoming_incoming.id_product = prices.id_product = الأسعار حدد id_incoming من الوارد حيث id_vendor = i) ؛ حدد SUM (الملخص) من report_vendor ؛ نهاية //

لكن الإجراء لن يعمل بهذه الطريقة. الشيء هو أن لا يمكن استخدام أي معلمات في طرق العرض... لذلك ، سيتعين علينا تغيير تسلسل الطلبات بشكل طفيف. أولاً ، سننشئ طريقة عرض ستخرج معرّف البائع (id_vendor) ، ومعرّف المنتج (id_product) ، والكمية ، والسعر ، والملخص من ثلاثة جداول التسليم (الواردة) ، و Magazine_incoming ، والأسعار (الأسعار):

قم بإنشاء عرض report_vendor AS SELECT الوارد. ؛

وبعد ذلك سننشئ طلبًا يلخص كميات التوريد للمورد الذي نهتم به ، على سبيل المثال ، مع id_vendor = 2:

يمكننا الآن دمج هذين الطلبين في إجراء مخزن ، حيث ستكون معلمة الإدخال هي معرف البائع (id_vendor) ، والذي سيتم استبداله في الطلب الثاني ، ولكن ليس في العرض:

إنشاء إجراء sum_vendor (i INT) ابدأ إنشاء عرض report_vendor AS SELECT الوارد. id_product AND magazine_incoming.id_incoming = incoming.id_incoming ؛ حدد SUM (الملخص) من report_vendor حيث id_vendor = i ؛ نهاية //


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


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

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

إجراء إسقاط sum_vendor // إسقاط عرض report_vendor // إنشاء عرض report_vendor AS SELECT الوارد. .id_product AND magazine_incoming.id_incoming = incoming.id_incoming // CREATE PROCEDURE sum_vendor (i INT) start SELECT SUM (Summa) FROM report_vendor WHERE id_vendor = i؛ نهاية //


فحص العمل:

call sum_vendor (1) // call sum_vendor (2) // call sum_vendor (3) //


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

إنشاء الإجراء sum_vendor (i INT) ابدأ DROP VIEW إذا كان EXISTS report_vendor ؛ قم بإنشاء عرض report_vendor AS SELECT الوارد. ؛ حدد SUM (الملخص) من report_vendor حيث id_vendor = i ؛ نهاية //

تذكر إزالة الإجراء sum_vendor قبل استخدام هذا الخيار ، ثم اختبره:

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