PDA

نسخه کامل مشاهده نسخه کامل : تفاوت بین تابع و Stored Procedure



Life24
24-04-2013, 11:14
سلام

من 2 تا تابع ایجاد کردم. یکی مثلا یک عدد میگیره و میره یک سطر برمی گردونه(تابع با برگرداندن جدول)
تابع دوم یک اسم میگیره و مثلا یک عدد برمیگردونه

حالا stored procedure
هم ساختم. مثلا نام شهر میدم و در اون جدول هر چی نام شهر میبینه با نام جدیدی که بهش دادم تغیر میده

یعنی در کل فرق بین تابع و stored procedure تو این هست که اون میره یک کاری انجام میده و یک جدول یا مقدرا انجام میده
اما stored procedure یک وظیفه ای انجام میده بدون نیاز به برگرداند چیزی؟

میشه مثالی بزنید از تفاوت هاش.واقعا نیاز دارم. :n21: :n16:
دو تا مثال که مثلا با تابع نشه انجام داد و با Stored Procedure میشه. .. و برعکس
ممنون

anvar.net
24-04-2013, 21:55
تعاریف : روال ذخیره شده : برنامه یا روالی است که بصورت فیزیکی در داخل پایگاه داده قرار می گیرد, مزیت استفاده از رال ذخیره شده در این است که هر وقت توسط کاربر فراخواین و اجرا شود توسط موتور پایگاه داده و بر روی سرور پایگاه داده مجزا اجرا می شود لذا بصورت مستقیم به داده های دیتابیس دسترسی دارد.
در عوض تابع : یک روال روتین است که منطق خاصی را بصورت کپسوله در خود دارد که توسط سایر کوئری ها مورد استفاده قرار می گیرد. تفاوت تابع با نما یا ویو هم در این است که بر خلاف ویو , تابع می تواند چندین دستور Select داشته باشد.
کلا در SQL دو نوع تابع وجود دارد, توابع پیش ساخته سیستم که معمولا Window functions خوانده میشوند, مثلا تابع جمع ستون ها, میانگین, ماکسیموم, گرفتن تاریخ جاری و ......, نوع دوم از توابع , توابعی هستند که توسط کاربر تعریف می شوند این توابع خود می توانند با توجه به مقدار برگشتی در 2 دسته قرار بگیرند
توابعی Scalar که توسط کاربر تعریف می شوند یک مقدار داده ای منفرد از نوعی که در قید تصریح شده باشد را برگشت می دهند نوع داده ای مقدار برگشت هم می تواند هر چیزی به جزء Text - NText-Image-Cursor و timestamp باشد.
مثلا در مثال زیرکه یک تابع Scalar است, تابع یک مقدار ورودی ProductID را می گیرد و یک مقدار داده ای را نیز برگشت می دهد که مجموع تعداد جنس مورد نظر (جنس خاص با ProductID گرفته شده بعنوان پارامتر ورودی) در انبار است:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

در کوئری زیر از تابع بالا استفاده می کنیم و مجموع تعداد جنس هایی که ProductModelID آنها بین 75 و 80 را می گیریم :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

نوع دوم از توابع , توابع جدول مقدار هستند, و برگشتی این توابع از نوع Datatable است.

نوع سومی را هم می توان در نظر گرفت که به توابع داخلی موسوم هستند, این توابع دارای یک دستور Select ساده هستند.
حالا تفاوت روال های ذخیره شده و تابع :
روال های ذخیره شده می توانند مقدار برگشتی صفر یا n داشته باشند اما در تابع مقدار برگشتی منفرد است.
توابع را می توان از داخل روال های ذخیره شده فراخوانی کرد اما حالت عکس امکان پذیر نیست.
در روال های ذخیره شده خطاها را می توان در بلوک try catch مهار و مدیریت کرد اما در توابع نمی توان از این بلوک استفاده کرد.
توابع را می توان در قسمت های مختلف مانند Where-Having و Select استفاده کرد اما برای روال های ذخیره شده اینطور نیست.

و .................... چندین اختلاف بنیادی دیگه که در اینجا جای بحث نیست