در قسمت یازدهم آموزش SQL Server ،دستوراتی را نوشتیم که همزمان چندکار را انجام دهند و پیش زمینه ای برای مبحث Stored Procedure ها را به شما آموزش دادیم. دراین قسمت قصد داریم Stored Procedure را در قالب مثال به شما آموزش بدیم.
حال میخواهیم نحوه کار با Stored Procedure را به شما اموزش دهیم به مثال های زیر توجه کنید :
Create Procedure test1 AS Begin Select * from Tbl_Ketab End Go Execute test1
در کدهای بالا ما مثالی ساده را زده ایم که در ابتدا با کلمات کلیدی Create Procedure یک پروسیجر با نام test1 میسازیم و سپس عبارت AS و بعد هم در بدنه Begin و End دستورات خود را مینویسیم که در این کوری ما دستور ساده ای برای نمایش همه اطلاعات جدول کتاب نوشته ایم حتما به این نکته توجه داشته باشیدکه برای اجرا و نمایش نتیجه پروسیجر باید دستورات Go و سپس Execute Procedure_Name را بنویسیم در غیر این صورت شما نتیجه را نمیتوانید مشاهده کنید.
حال اگر بخواهیم تغییری در کدها ایجاد کنیم و باز انرا اجرا کرده و نتیجه را مشاهده کنیم با خطای زیر مواجه میشویم
برای مثال ما دستور فوق را به این صورت تغییر میدهیم
Create Procedure test1 AS Begin Select * from Tbl_Ketab Where Code_Ketab=1 End go Execute test1
پس از نوشتن و کلیک کردن دکمه Execute با خطا زیر مواجه میشوید
در خطا بالا همانگونه که گفته شده یک پروسیجر با نام test1 قبلا ساخته شده و در پایگاه داده وجود دارد و دیگر نمتوان این را اجرا کرد زیرا پروسیجر ها هم مثل جدول های موقت در یکی از زیر پوشه های بانک ساخته میشوند و فقط میتوان یکبار با یک نام انهارا ساخت و نمیتوان انهارا دیگر تغییر داد برای رفع این مشکل که بتوان پس از ایجاد نیز در کدها تغییر ایجاد کرد و باز هم نتیجه را مشاهده باید بجای Create در خط اول از کلمه Alter استفاده کرد در واقع کدها به شکل زیر تغییر میکند.
همانگونه که در عکس فوق میبیند بجای کلمه Create ما از کلمه Alter استفاده کرده ایم و میبینید که پس از اجرا نیز تنها ان رکوردی را به ما نشان میدهد ک کدش ۱ میباشد همچنین ما مسیر ذخیره پروسیجر هارا نیز برایتان مشخص کرده ایم.
به مثال زیر توجه کنید:
همانگونه که در تصویر فوق مشاهده میکنید ما پروسیجری نوشته ایم که ورودی میپذرید و سپس براساس ان ورودی عملیاتی انجام میدهد که در اینجا ورودی را کد کتاب قرار داده ایم که همانگونه که میبینید برای نوشتن پروسیجری که ورودی دارد باید نام ورودی و نوعش را در جلوی نام پروسیجر درون پرانتز ذکر کرد سپس در بدنه پروسیجر ما دستوراتی نوشته ایم که به بدین معنی است که میگوید جمع حاصل ضربه فیلد قیمت و تعداد در جدول کتاب را در رکوردی که کدش برابر با ورودی میباشد را برگردان و انهارا براساس کد کتاب و نام کتاب مشخص کن و در اخر نیز باید در جلوی دستور Execute test2 مقدار ورودی را وارد کنیم که در اینجا ما مقدار ۱ را وارد کرده ایم و در نتیجه نیز عملیات گفته شده را بروی کتاب با کد ۱ انجام میدهد و همچنین میتوان نامی برای ستون ایجاد شده در نظر گرفت و دوباره دستورات را اجرا کرد اما حتما باید بجای Create از Alter استفاده کنید.
به مثال زیر توجه کنید:
Create Procedure test3(@nameketab nvarchar(max),@groupname nvarchar(max)) AS Begin if(not exists(Select * from Tbl_Ketab where Name_Ketab=@nameketab)) Begin if(exists(Select * from Tbl_Group where Group_name=@groupname)) Begin insert into Tbl_Ketab (Name_Ketab,ID_Group) select @nameketab , groupname) End else Begin insert into Tbl_Group Select @groupname insert into Tbl_Ketab (Name_Ketab,ID_Group) values(@nameketab,@@IDENTITY) End End End Go Execute test3 'hesaban' , 'riazi pish'
هدف از نوشتن کوری بالا ثبت نام کتاب و نام گروه میباشد که به عنوان ورودیدریافت میشود و پس از چک کردن تمام احتمالات انهارا به نحوی در بانک ثبت میکند که حال خط به خط انرا برایتان توضیح خواهیم داد.
خط اول که همانگونه که قبلا گفته شده برای ایجاد پروسیجر است و مقادیر درون پرانتز نیز متغیر های ورودی میباشد که از نوع nvarchar و max میباشند بدین معنی که حداکثر مقدار را میتواند قبول کند که حدودا چهار هزار کاراکتر میباشد که یکی از ورودی ها نام کتاب و دیگری نام گروه میباشد پس از نوشتن کلمه کلیدی As بدنه پروسیجر را مینویسیم در اولین Begin شرطی ذکر شده بدین معنی که تمام مقادیر جدول کتاب را انتخاب کن و به دنبال رکوردی بگرد که فیلد Name_Ketab ان برابر با مقدار متغیر @nameketab باشد و اگر وجود نداشت یعنی یعنی نامی مشابه مقدار متغیر درون جدول نبود به Begin بعد برو در بدنه Begin دوم نیز شرطی نوشته شده بدین معنی که اگر در جدول گروه در فیلد Name_Group مقداری مشابه متغیر ورودی @namegroup وجود داشت انگاه به بدنه Begin بعد برو که میگوید درون جدول کتاب به فیلد های نام کتاب و نام گروه مقادیر متغیرهای ورودی @nameketab و @namegoroup را بده و این بدنه را میبندد
اما در غیر این صورت که هیچ کدام از این دو شرط برقرار نبود بدنه Else اجرا میشود که در این بدنه نیز درون جدول گروه یک رکورد ایجاد میکند شامل مقدار متغیر ورودی @grouoname (مقدار ID_Group در جدول گروه به صورت Identity مقداردهی مشود و نیازی نیست ما به صورت دستی به ان مقدار دهیم) و در خط بعد نیز در جدول کتاب دو فیلد نام کتاب و ای دی گروه را مشخص کرده و سپس به انها مقدار داده که به نام کتاب مقدار @nameketab و ای دی گروه نیز مقدار @@Identity (این عبارت به اخرین مقدار Identity ایجاد شده در سکشن جاری اشاره دارد یعنی مثلا ما این عبارت را بجای ID_Group در جدول کتاب قرار داده ایم پس این عبارت اخرین مقدار Identity درون جدول گروه را به ما برمیگرداند)
در اخر نیز تمام Begin ها را که باز بود را بستیم و با دستور Go دستور به اجرای پروسیجر دادیم همچنین دو مقدار ورودی را باید برایش قرار دهیم
*دو فیلد نام کتاب و نام گروه که در جدول کتاب ما مقداردهی کردیم با عملیات دیگری روی ان انجام داده ایم گزینه Allow Null انها فعال نیست اما بقیه فیلد ها میتوانند مقدار Null بگیرند