Stored Procedure: بستهبندی منطق داخل پایگاهداده
متوسط
۱۲ دقیقه مطالعه
پیش از شروع:
Stored Procedure کاملاً مخصوص SQL Server (و موتورهای مشابه) است. SQLite هیچ مفهومی معادل آن ندارد — به همین دلیل، این درس بر خلاف بقیهی درسها، جعبهی «امتحانش کن» زنده ندارد؛ فقط کد واقعی SQL Server را میبینیم.یک رویهی ذخیرهشده (Stored Procedure) مجموعهای از دستورهای SQL است که با یک نام ذخیره میشود و میتوان با یک فراخوانی ساده، کل آن را اجرا کرد — دقیقاً مثل یک تابع در یک زبان برنامهنویسی معمولی، اما اینبار داخل خودِ پایگاهداده.
ساختار پایه
sql
CREATE PROCEDURE GetStudentsByCity @City NVARCHAR(50) AS BEGIN SELECT full_name, grade FROM students WHERE city = @City; END;
و برای اجرا کردنش:
sql
EXEC GetStudentsByCity @City = N'تهران';
@City یک پارامتر است — دقیقاً مثل پارامتر ورودی یک تابع؛ هر بار میتوان مقدار متفاوتی برایش فرستاد، بدون اینکه مجبور باشی خود پرسوجو را از نو بنویسی.
چرا اصلاً از Stored Procedure استفاده کنیم؟
- عملکرد: SQL Server نقشهی اجرای رویه را کش میکند؛ فراخوانیهای بعدی معمولاً سریعتر از فرستادن مکرر متن خام SQL هستند.
- امنیت: میتوان به کاربر فقط اجازهی اجرای رویه را داد، بدون دسترسی مستقیم به جدولهای زیرین — مشابه همان ایدهی امنیتی که در درس View دیدیم.
- یکجا نگهداشتن منطق: اگر چند اپلیکیشن مختلف (وب، موبایل) باید همان منطق پیچیده را اجرا کنند، نوشتنش یکبار در رویه، از تکرار در هر اپلیکیشن جلوگیری میکند.
پارامتر خروجی (OUTPUT)
رویهها میتوانند مقداری را هم به بیرون برگردانند:
sql
CREATE PROCEDURE CountStudentsByCity @City NVARCHAR(50), @Total INT OUTPUT AS BEGIN SELECT @Total = COUNT(*) FROM students WHERE city = @City; END;
حذف یک رویه
sql
DROP PROCEDURE GetStudentsByCity;
چون اینجا نمیتوانی رویهی واقعی اجرا کنی، بهترین راه یادگیری، اجرای همان پرسوجوی داخل رویه (بدون
CREATE PROCEDURE، فقط با یک مقدار ثابت بهجای پارامتر) در Playground است — همان منطق، بدون بستهبندی. برای مثال، معادل اجرای GetStudentsByCity @City = 'تهران' در Playground، دقیقاً همان SELECT full_name, grade FROM students WHERE city = 'تهران'; است که در درس WHERE هم زدیم.جمعبندی این درس
- Stored Procedure مجموعهای از دستورهای SQL با یک نام است که با
EXECفراخوانی میشود. - پارامترها (
@Name) اجازه میدهند همان منطق با ورودیهای متفاوت اجرا شود. - مزایای اصلی: کارایی (کششدن نقشهی اجرا)، امنیت، و یکجا نگهداشتن منطق تکراری.
- این یک ویژگی کاملاً مخصوص SQL Server است؛ SQLite معادلی برایش ندارد.
در درس بعدی سراغ Functions میرویم — شبیه رویهها، اما با یک تفاوت مهم: همیشه یک مقدار برمیگردانند و میتوان مستقیم داخل یک SELECT صدایشان زد.