رویههای ذخیره شده Stored Procedures
پروسیجرهای ذخیره شده (Stored Procedures) یکی از ویژگیهای مهم در سیستمهای مدیریت پایگاه داده (DBMS) هستند که به کاربران اجازه میدهند مجموعهای از دستورات SQL را در قالب یک پروسیجر ذخیره کرده و سپس آن را با یک فراخوانی ساده اجرا کنند. این پروسیجرها میتوانند پارامترهای ورودی و خروجی داشته باشند و معمولاً برای انجام عملیاتهای پیچیده و تکراری استفاده میشوند.
مزایای استفاده از پروسیجرهای ذخیره شده:
- کاهش ترافیک شبکه: به جای ارسال چندین دستور SQL به سرور، تنها یک فراخوانی پروسیجر ارسال میشود.
- افزایش کارایی: پروسیجرها معمولاً بهینهسازی شدهاند و میتوانند عملکرد بهتری نسبت به اجرای دستورات جداگانه داشته باشند.
- امنیت: میتوان دسترسی به دادهها را از طریق پروسیجرها کنترل کرد و دسترسی مستقیم به جداول را محدود نمود.
- قابلیت استفاده مجدد: پروسیجرها میتوانند در بخشهای مختلف برنامه مورد استفاده قرار گیرند.
- سادگی در نگهداری: تغییرات در منطق کسبوکار تنها در یک مکان (پروسیجر) اعمال میشود.
ساختار کلی یک پروسیجر ذخیره شده:
CREATE PROCEDURE نام_پروسیجر
(
@پارامتر1 نوع_داده,
@پارامتر2 نوع_داده
)
AS
BEGIN
-- دستورات SQL
END
مثال ساده:
CREATE PROCEDURE GetEmployeeDetails
(
@EmployeeID INT
)
AS
BEGIN
SELECT * FROM Employees WHERE EmployeeID = @EmployeeID;
END
اجرای پروسیجر:
EXEC GetEmployeeDetails @EmployeeID = 1;
ویرایش یا حذف پروسیجر:
- ویرایش: از دستور
ALTER PROCEDURE
استفاده میشود. - حذف: از دستور
DROP PROCEDURE
استفاده میشود.
نکات مهم:
- پروسیجرها میتوانند شامل دستورات شرطی، حلقهها، مدیریت خطا و سایر ساختارهای برنامهنویسی باشند.
- در برخی سیستمهای مدیریت پایگاه داده مانند MySQL، پروسیجرهای ذخیره شده با استفاده از
CREATE PROCEDURE
وCREATE FUNCTION
ایجاد میشوند.
استفاده از پروسیجرهای ذخیره شده میتواند به بهبود عملکرد و سازماندهی بهتر کدهای SQL کمک کند.
توضیحات بیشتر در مورد پروسیجرهای ذخیره شده
در اینجا چند مثال کاملتر از پروسیجرهای ذخیره شده (Stored Procedures) در SQL ارائه میشود. این مثالها شامل ایجاد، اجرا و مدیریت پروسیجرها هستند و برای سیستمهای مدیریت پایگاه داده مانند SQL Server، MySQL یا PostgreSQL قابل استفادهاند.
مثال ۱: پروسیجر ساده برای درج داده در یک جدول
فرض کنید جدولی به نام Customers
داریم که شامل ستونهای CustomerID
, FirstName
, LastName
, Email
است. میخواهیم یک پروسیجر ایجاد کنیم که دادههای جدید را به این جدول اضافه کند.
ایجاد پروسیجر:
CREATE PROCEDURE InsertCustomer
(
@FirstName NVARCHAR(50),
@LastName NVARCHAR(50),
@Email NVARCHAR(100)
)
AS
BEGIN
INSERT INTO Customers (FirstName, LastName, Email)
VALUES (@FirstName, @LastName, @Email);
END
اجرای پروسیجر:
EXEC InsertCustomer
@FirstName = 'Ali',
@LastName = 'Rezaei',
@Email = 'ali.rezaei@example.com';
مثال ۲: پروسیجر با پارامتر خروجی
فرض کنید میخواهیم تعداد کل مشتریان را در یک پارامتر خروجی برگردانیم.
ایجاد پروسیجر:
CREATE PROCEDURE GetTotalCustomers
(
@TotalCustomers INT OUTPUT
)
AS
BEGIN
SELECT @TotalCustomers = COUNT(*) FROM Customers;
END
اجرای پروسیجر:
DECLARE @Total INT;
EXEC GetTotalCustomers @TotalCustomers = @Total OUTPUT;
PRINT 'Total Customers: ' + CAST(@Total AS NVARCHAR(10));
مثال ۳: پروسیجر با دستورات شرطی
فرض کنید میخواهیم یک پروسیجر ایجاد کنیم که اگر مشتری با ایمیل مشخص وجود داشت، اطلاعات او را برگرداند، در غیر این صورت پیام مناسبی نمایش دهد.
ایجاد پروسیجر:
CREATE PROCEDURE GetCustomerByEmail
(
@Email NVARCHAR(100)
)
AS
BEGIN
IF EXISTS (SELECT 1 FROM Customers WHERE Email = @Email)
BEGIN
SELECT * FROM Customers WHERE Email = @Email;
END
ELSE
BEGIN
PRINT 'Customer with email ' + @Email + ' not found.';
END
END
اجرای پروسیجر:
EXEC GetCustomerByEmail @Email = 'ali.rezaei@example.com';
مثال ۴: پروسیجر با استفاده از تراکنشها
فرض کنید میخواهیم یک پروسیجر ایجاد کنیم که درج داده در دو جدول (Orders
و OrderDetails
) را به صورت اتمی انجام دهد. اگر خطایی رخ دهد، تغییرات بازگردانده میشوند.
ایجاد پروسیجر:
CREATE PROCEDURE InsertOrder
(
@CustomerID INT,
@ProductID INT,
@Quantity INT,
@OrderDate DATE
)
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION;
-- درج سفارش جدید در جدول Orders
INSERT INTO Orders (CustomerID, OrderDate)
VALUES (@CustomerID, @OrderDate);
-- دریافت OrderID ایجاد شده
DECLARE @OrderID INT = SCOPE_IDENTITY();
-- درج جزئیات سفارش در جدول OrderDetails
INSERT INTO OrderDetails (OrderID, ProductID, Quantity)
VALUES (@OrderID, @ProductID, @Quantity);
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
PRINT 'An error occurred. Transaction rolled back.';
END CATCH
END
اجرای پروسیجر:
EXEC InsertOrder
@CustomerID = 1,
@ProductID = 101,
@Quantity = 2,
@OrderDate = '2025-02-14';
مثال ۵: پروسیجر با حلقه و پردازش دادهها
فرض کنید میخواهیم یک پروسیجر ایجاد کنیم که تمام مشتریان را بررسی کند و اگر ایمیل آنها خالی باشد، ایمیل پیشفرض را تنظیم کند.
ایجاد پروسیجر:
CREATE PROCEDURE UpdateEmptyEmails
AS
BEGIN
DECLARE @CustomerID INT;
DECLARE @Email NVARCHAR(100);
-- تعریف کرسر برای پیمایش دادهها
DECLARE CustomerCursor CURSOR FOR
SELECT CustomerID, Email FROM Customers;
OPEN CustomerCursor;
FETCH NEXT FROM CustomerCursor INTO @CustomerID, @Email;
WHILE @@FETCH_STATUS = 0
BEGIN
IF @Email IS NULL OR @Email = ''
BEGIN
UPDATE Customers
SET Email = 'no-email@example.com'
WHERE CustomerID = @CustomerID;
END
FETCH NEXT FROM CustomerCursor INTO @CustomerID, @Email;
END
CLOSE CustomerCursor;
DEALLOCATE CustomerCursor;
END
اجرای پروسیجر:
EXEC UpdateEmptyEmails;
مثال ۶: پروسیجر با پارامترهای اختیاری
فرض کنید میخواهیم یک پروسیجر ایجاد کنیم که اطلاعات مشتریان را بر اساس نام و نام خانوادگی فیلتر کند، اما اگر پارامترها خالی باشند، همه مشتریان را برگرداند.
ایجاد پروسیجر:
CREATE PROCEDURE GetCustomers
(
@FirstName NVARCHAR(50) = NULL,
@LastName NVARCHAR(50) = NULL
)
AS
BEGIN
SELECT * FROM Customers
WHERE (FirstName = @FirstName OR @FirstName IS NULL)
AND (LastName = @LastName OR @LastName IS NULL);
END
اجرای پروسیجر:
-- همه مشتریان
EXEC GetCustomers;
-- مشتریان با نام "Ali"
EXEC GetCustomers @FirstName = 'Ali';
-- مشتریان با نام خانوادگی "Ramezani"
EXEC GetCustomers @LastName = 'Ramezani';
این مثالها نشان میدهند که چگونه میتوان از پروسیجرهای ذخیره شده برای انجام عملیاتهای مختلف در پایگاه داده استفاده کرد. هر مثال را میتوان با توجه به نیازهای خاص پروژه سفارشیسازی کرد.
دیدگاه شما