رویه‌های ذخیره شده Stored Procedures

پروسیجرهای ذخیره شده (Stored Procedures) یکی از ویژگی‌های مهم در سیستم‌های مدیریت پایگاه داده (DBMS) هستند که به کاربران اجازه می‌دهند مجموعه‌ای از دستورات SQL را در قالب یک پروسیجر ذخیره کرده و سپس آن را با یک فراخوانی ساده اجرا کنند. این پروسیجرها می‌توانند پارامترهای ورودی و خروجی داشته باشند و معمولاً برای انجام عملیات‌های پیچیده و تکراری استفاده می‌شوند.

مزایای استفاده از پروسیجرهای ذخیره شده:

  1. کاهش ترافیک شبکه: به جای ارسال چندین دستور SQL به سرور، تنها یک فراخوانی پروسیجر ارسال می‌شود.
  2. افزایش کارایی: پروسیجرها معمولاً بهینه‌سازی شده‌اند و می‌توانند عملکرد بهتری نسبت به اجرای دستورات جداگانه داشته باشند.
  3. امنیت: می‌توان دسترسی به داده‌ها را از طریق پروسیجرها کنترل کرد و دسترسی مستقیم به جداول را محدود نمود.
  4. قابلیت استفاده مجدد: پروسیجرها می‌توانند در بخش‌های مختلف برنامه مورد استفاده قرار گیرند.
  5. سادگی در نگهداری: تغییرات در منطق کسب‌وکار تنها در یک مکان (پروسیجر) اعمال می‌شود.

ساختار کلی یک پروسیجر ذخیره شده:

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';

این مثال‌ها نشان می‌دهند که چگونه می‌توان از پروسیجرهای ذخیره شده برای انجام عملیات‌های مختلف در پایگاه داده استفاده کرد. هر مثال را می‌توان با توجه به نیازهای خاص پروژه سفارشی‌سازی کرد.

دیدگاه شما

نشانی ایمیل شما منتشر نخواهد شد.