imadouzoun

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

13 ردود في هذا الموضوع

الإجراءات المخزنة في قاعدة البينات : The Stored Procedure

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

وتقبل هده الجراءات بارامترات وتعيد أيضاً قيم وبارامترات و سجلات و .. إلخ

يمكن الوصول إلى هده البارامترات بسهولة عن طريق إي لغة برمجة و إعطاء بارامترات الدخل

قيم و الحصول على قيم البارامترات المعادة من هده الإجراءات .

النقطة الهامة في هدا المجال هو وجود بارامتر و اسمه @RETURN_VALUE يعود الإجراء به

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

وتسمى لغة البرمجة المستخدمة في كتابة هده الإجراءات بـ Transact-Sql و إختصاراً تدعى بـ T-SQL

وهناك فوائد جمة من استخدام الـ stored procedure و خصوصاً فيما يخص الإستعلامات عن سجلات من قاعدة البيانات و سأدكر بعضها ..

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

أي أن تنشئ إجراء واحد لاستخدامه عدد من المرات في لغة البرمجة كـ دلفي , فيجوال ستوديو و ... إلخ

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

تنفيد عبارات الـ SQl في الإجراء المخزن أسرع من إرسال هده العبارات من لغة برمجة خارجية :

وخاصة إدا كانت هده العبارات مطلوبة بشكل متكرر لأن عبارات الـ SQl الموجودة في الإجراء المخزن

و تحسن عند إنشائها في قاعدة البيانات .

حيث أن سكول سيرفر تقوم بحفظ نسخة عن الإجراء بعد استدعائه للمرة الأولى و بالتالي يكون استدعاء نفس الإجراء أسرع في المرات التالية أما عبارة الـ SQL المرسلة من الخارج فتحتاج إلى أن تترجم وتفسر

في كل مرة نرسل فيها هده العبارات .

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

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

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

و يتم تعريف الإجراء المخزن بالإعتماد على مكونين رئيسيين :

1- اسم الإجراء والبارامترات .

2-جسم الإجراء أي العبارات المشكلة لهدا الإجراء .

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

المبرمج عماد ... B) B)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

كيف يتم إنشاء الإجراءات المخزنة : Creating Stored Procedure

يمكننا إنشاء إجراء مخزن باستخدام عبارة Create Proc أو Create Procedure ولكن قبل أن تنشئ إجراء مخزن عليك أولاً أن تراعي ما يلي :

1- يجب أن تكون عبارة Create Proc في أول كتلة أو في كتلة مستقلة أو بعد عبارة Go التي تفصل بين كتلتين

2- بشكل افتراضي عبارة الـ Create Proc مسموح بها لمالك قاعدة البيانات أي الذي أنشأ القاعدة الذي يمكنه أن يمنح هذا الحق (أي إنشاء إجراءات مخزنة لبقية المستخدمين) .

3- الإجراءات المخزنة هي عبارة عن أغراض مثل الجداول و الفهارس والقيود و .. و بالتالي تتبع تسميتها لقواعد تسمية الأغراض و المتحولات في قاعدة البيانات الـ SqlServer .

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

عادة للإشارة إلى غرض ما من قاعدة بيانات ما فإننا نكتب : DataBase.ObjOwner.ObjName

أما إذا حاولنا أن ننشئ إجراء جديد ضمن الـ EnterPrise Manger فإننا نلاحظ أنه يضع الشكل الإفتراضي التالي لما يجب أن يكون عليه الإجراء :

CREATE PROCEDURE [OWNER].[PROCEDURE NAME] AS

لاحظ غياب اسم قاعدة البيانات ... من الشكل العام ...

5- يتم تعريف الإجراء المخزن بتحديد ما يلي :

• بارامترات الدخل و الخرج للإجراء .

• عبارات الإجراء البرمجية (جسم الإجراء) والتي قد تشمل استدعاء دوال أخرى و إجراءات أخرى .

• قيمة البارامتر الذي يدل على حالة الإجراء (نجاحه أم فشله) وسبب فشل الإجراء .

الإجراءات المخزنة التابعة للنظام (لمخدم الـSql ) : System Stored Procedure

إن العديد من النشاطات الإدارية في مخدم الـ Sql تنجز بواسطة نوع خاص من الإجراءات المخزنة و المعروف بـ System Stored Procedure التي تنشأ وتخزن في قاعدة البيانات Master DataBase وتملك السابقة (أول أحرف منها) Sp_ . تتميز هذه الإجراءات بأنها يمكن أن تستدعى من أي قاعدة بيانات بدون حتى أن تذكر اسم قاعدة البانات التي استدعي منها هذا الإجراء (أي القاعدة Master) أي ليس هناك من ضرورة لأن تكتب مايلي لتستدعي أحد إجراءات النظام :

Master..Sp_Help فيكفي أن تكتب Sp_Help مباشرة ...

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

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

• ضمن الإجراءات التابعة للنظام في قاعدة البيانات Master .

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

• ضمن الإجراءات التي تتبع للمستخدم dbo .

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

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

تجميع الإجراءات المخزنة Grouping Stored Procedure :

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

إن أحد فوائد تجميع الإجراءات هو عند الإجراءات من الإسم المشترك لهن سيتم حذف جميع الإجراءات في اّن واحد

فمثلاً الإجراءات في تطبيق موحد تجمًع كما يلي :

اسم التطبيق : MyApp

• MyProc1

• MyProc2

• MyProc3

• ..

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اخي العزيز..

اشكرك على دروسك القيمة.. لكن عندي سؤالين كمناقشة وتكملة لموضوعك لأني اود أن افهم..

1- هل العبارة go تفرق بين كتلتين يعني اني اقدر اكتب جملتين select وافرق بينهم بكلمة go واتمنى منك تضرب مثال..

2- هل البروسيجر يعمل على Access وهل اذا احببت اني اكتب جملتين select في Access فماذا اعمل..

وجزاك الله اخي خيراً على دروسك القيمة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم يا "متعلم جديد" :

يا أخي التعليمة Go خاصة بلغة البرمجة التابعة للـ SqlServer على كل حال أنا جربت أن أضع استعلامين في أكسس مفصولين بـ

Go ولكن كما كنت أتوقع أعطى المصرف خطأ بأن هناك محارف غريبة بعد الإستعلام الأول ...

ولكن لماذا تريد السباغيتي بعبارات الـ Sql أقصد دمج كودي SQL في استعلام واحد ؟؟ ما الفائدة من هذه الدوخة ؟؟ :blink: :blink:

المبرمج عماد .. B) B)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

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

نشد على يدك لكي تستمر في هذه الدروس. وجزاك الله الف خير

اخوك Whale

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم :

أولاً تحياتي للجميع .. ياشباب أتمنى ألا تطلقوا علي الألقاب < أستاذ أو معلم .. أو .. أو .. >

لأني حقيقة لست Proffessional و لا مبتدئ يمكنكم القول متعلم مجتهد .. الحقيقة أني أجهد

كثيراً لتعلم ما هو جديد و مفيد و تجربته و البحث عنه في الـ Help أو على الوب و أترجم ما أجده مفيداً و هاماً ..

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

أن أكون عند حسن ظنكم ...

والسلام عليكم ورحمة الله و بركاته ... :) :)

المبرمج عماد .. B) B)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم و رحمة الله و بركاته هذه هي المقالة الثالثة أتمنى أن يكون فيها فائدة لكل من يحتاجها ... :rolleyes: :rolleyes:

ملاحظة المقالة موجود كملف مضغوط في الأسفل ......

تكملة في الـ Stored Procedure :

تتصل الإجراءات المخزنة مع البرامج التي تستخدمها كما لمحت سابقاً عن طريق البارامترات أو المتحولات التي تقدمها هذه الإجراءات و كما ذكرت أن الإجراء المخزن لديه بارامترات دخل وأخرى للخرج Input / Output Parameter علماً أن الإجراء المخزن يمكنه أن يستوعب 2100 متحول أو بارامتر للتواصل مع البرامج الخارجية

.................................................................................................................................

تعريف البارامترات (المتغيرات) للإجراء المخزن : Specifying a Name

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

Create Proc My_Proc 
@first_param varchar(50) ,
@ first_param varchar(20)

لاحظ على الرغم من إختلاف الطول مثلاً .. ×××× لا يجوز ذلك ××××

و تخضع هذه التسمية لقواعد منها : أن البارامتر يجب أن يكون مسبوقاً بالمحرف @ .. كما متغيرات الـ PHP مثلاً التي تستوجب وضع الرمز $ قبل اسم المتحول .. لكل وجهة نظره في هذا .

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

1- هي أن تذكر أسماء المتحولات بشكل صريح و تسند لكل منها القيمة التي تتبع له على النحو التالي :

Exec My_Proc @first_param = ‘value1’ , @second_param = ‘value2’

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

البارامترات الذي يستخدمه الإجراء ..

مثال : على تقديم البارامترات بهذه الطريقة :

Exec My_Proc ‘value1’, ‘value2’

لاحظ أن القيمة ‘value2’ سيتم إسنادها إلى البارامتر @second_param

و القيمة ‘value1’ سيتم إسنادها إلى البارامتر @first_param ...

ملاحظة : الطريقة الأولى لا تستوجب وضع البارامترات بالترتيب الصحيح أي إذا كتبنا ما يلي :

Exec My_Proc @second_param = ‘value2’ , @first_param = ‘value1’

فهذا صحيح 100% ..

أما الطريقة الثانية كما ذكرت تتطلب منك ذكر القيم المقدمة إلى الإجراء بالترتيب الصحيح ..

ملاحظة 2 :

عادة ما تكون في بعض الإجراءات بارامترات لها قيم إفتراضية كما في أي لغة دلفي , فيجوال و غيرها .. و تأتي القيم الإفتراضية عادة بعد نوع البيانات للبارامتر مثلاً :

Create Proc My_Proc 
 @param1 Int  ,
 @param2 nvarchar(50)  ,
 @param3 varchar(25)  = ‘ArabTeam2000 is a good site’
As
{ مجموعة التعليمات التي سوف ينفذها الإجراء}
Go

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

Exec My_Proc  12 , ‘Value2’  

لاحظ أننا لم نقدم قيمة للبارامتر الثالث و بالتالي ستيأخذ القيمة :

 ‘ArabTeam2000 is a good site’

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

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

إذا كتبنا كالتالي :

Create Proc My_Proc 
 @param1 Int  ,
 @param2 varchar(25)  = ‘ArabTeam2000 is a good site’  ,
 @param3 bit  
As
{ مجموعة التعليمات التي سوف ينفذها الإجراء}
Go

علماً أن Bit : متحول بولياني يقبل قيمتين 0 و 1 بدلاً من True و False

و أردنا أن نترك المتحول أو البارامتر الثاني يأخذ قيمته من القيمة الإفتراضية عندها سيتوجب علينا إعطاؤه قيمة رغم أننا عرفنا له قيمة إفتراضية :

Exec 121, 1

هذا الكود التنفيذي يعطي رسالة خطأ .. السبب :

لأن الكود لن يفهم أن القيمة 1 التي لم يتم وضعها بين إشارتي هي للبارامتر الثالث

من نوع Bit .. بل اعتبرها للبارامتر الثاني ذو النوع varchar(25)

و لحل المشكلة نستخدم الطريقة الثانية لتقديم قيم البارامترات :

Exec @param1 = 7 , @param3 = 1

الاّن تكون المشكلة قد انتهت المشكلة ....

كيفية تحديد نوع البيانات لبارامترات الإجراء المخزن :

كما تقوم عادة بتحديد نوع بيانات لحقول الجدول عند القيام بتصميمه , يجب عليك أن تحدد نوع بيانات البارامترات .. من أبسطها (bit,varchar , …) إلى .. Image و Text ...

مع العلم أن نوع البيانات مؤشر لا يمكن إستخدامه إلا كبارامتر خرج OutPut Paramaeter ... ونوع البيانات كما تعلم يا أخي الكريم تحدد نوع البيانات التي سوف يأخذها البارامتر و مجالها .. مثلاً :

النوع Bit : يسمح بقيمتين 1 أو 0 .

النوع : TinyInt : يسمح بمجال قيم من 0  255 ..

النوع varchar : يسمح للنص أن يكون طوله بين 1  8000 محرف طبعاً يحدد الطول يحدد بقو سين كالتالي : varchar(50) أي 50 محرف كحد أقصى ..

أما إذا كتبنا varchar بدون تحديد الطول سيكون الطول افتراضياً 1 بايت .

تحديد وجهة البارامتر (دخل / خرج) :

لا يتوضح أي موضوع برأيي الشخصي بدون الأمثلة العملية على الوضع :

1- مثال تمرير بارامتر دخل للإجراء : تعديل اسم الموظف عن طريق رقمه التسلسلي :

Create Proc Update_Customers
  @id int ,  -- This is an input parameter
  @name nvarchar(50)  -- بارامتر دخل كالذي فوقه
As
  Update Customers_TB
 Set  
    Name = @name
 Where
    Id = @id
Go

بعد إنشاء هكذا إجراء بسيط فقط مرر له قيم البارامترات كما فعلنا سابقاً أخي الكريم :

Exec Update_Customers
  @id = 5 ,
  @name = ‘طارق ابراهيم’

مع احترامي الشديد للمعلم و الأستاذ طارق ابراهيم ... تحياتي ..

2- مثال تمرير بارامتر خرج للإجراء : معرفة الزبون ذو الرصيد الأعلى :

Create Proc Max_Customer_Account
   @Customer_name nvarchar(50) = ‘’ Output
As
  Select @Customer_name = Customers_TB .Name , Max(Customers_TB .Account)
 From
   Customers_TB
Group By  Customers_TB .Name

Go

يتم استدعاء هكذا إجراء كما يلي :

Declare @Name Nvarchar(50)
Exec Max_Customer_Account
   @Customer_name = @Name Output

Print @Name

المبرمج عماد .. B) B)

Stored_Procedure.zip

تم تعديل بواسطه imadouzoun
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم :

سأكمل إن شاء الله ما بدأته و اليوم بإذن الله سأحمل الدرس الرابع من (إبدأ T-Sql) وأتمنى من المشرفين الأساتذة متابعة الموضوع

للتعليق و تصحيح ما قد ينتج من أخطاء لا قدر الله بوجودها ..

و السلام عليكم..

أخوكم عماد .. B) B)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

عماد .. B) B)

t_sql_4.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

قمت بدمج الدروس في موضوع واحد وتثبيت الموضوع.

أجزل الشكر لصاحب الموضوع الأخ imadouzoun على ماقدمه.

:)

------

1- هل العبارة go تفرق بين كتلتين يعني اني اقدر اكتب جملتين select وافرق بينهم بكلمة go واتمنى منك تضرب مثال..

كلمة go ليست من تعابير TSQL ، ولكنها أمر موروث من الأداتين ISQL و OSQL والتي تستخدمان للتحكم في SQL Server من الCommand prompt تحدثنا عنهما من قبل في القسم، وحل Query analyzer محل الأداتين الآن .

تستخدم كلمة go للفصل بين دفعات batches أوامر TSQL ليبدأ المحرك في تنفيذ الدفعة السابقة لكلمة go وإظهار نتائجها والاستعداد لاستلام دفعة جديدة.

الجدير بالذكر أن المتغيرات المعلنة في دفعة لايمكن الوصول إليها من الدفعة التالية لها، مثلا:

declare @i int
select @i=1
go

select @i

سيصدر المحرك رسالة خطأ في السطر الأخير: Must declare the variable @i.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

فقط أحببت أن أضع هذا الكتيب عن الموضوع الذي تحدثت عنه سابقاً

" بداية في : التعامل مع أنواع البيانات في الـ Sql Server "

PDF File مع الإجرائيات بعدما قمت بترتيبها بالشكل المناسب ..

T_SQL_Types_Part1.rar

Procedure_Codes.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

-9

بارك الله لك أخى عماد على كل هذا المجهود

أختك إنجى

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .