ESC را فشار دهید تا بسته شود

زمیوس آموزش، یادگیری و سرگرمی

Cheat Sheet PL/SQL: آموزش IF، LOOP، CURSOR و Exception Handling

اگر با Oracle Database کار کرده باشید، خیلی زود متوجه می‌شوید که SQL به‌تنهایی برای پیاده‌سازی منطق‌های پیچیده کافی نیست. اینجاست که PL/SQL وارد میدان می‌شود.

PL/SQL یک زبان برنامه‌نویسی روی دیتابیس Oracle است که به شما اجازه می‌دهد کنار دستورات SQL از ساختارهای برنامه‌نویسی مثل شرط، حلقه، مدیریت خطا و پردازش رکوردها استفاده کنید.

در این مقاله آموزش Cheat Sheet اوراکلی، چهار مفهوم بسیار مهم PL/SQL را به شکل ساده و عملی بررسی می‌کنیم:

  • IF (دستورات شرطی)
  • LOOP (حلقه‌ها)
  • CURSOR (پردازش رکوردها)
  • Exception Handling (مدیریت خطا)

اگر با Oracle Database کار می‌کنید، احتمالاً خیلی زود به این نتیجه می‌رسید که فقط بلد بودن چند دستور SELECT و JOIN کافی نیست.

در دنیای واقعی، چیزی که تفاوت ایجاد می‌کند این است که بتوانید کوئری درست، سریع، قابل نگهداری و بهینه بنویسید.

پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.

در این مقاله شما می خوانید

PL/SQL (Procedural Language/SQL) زبان برنامه‌نویسی اختصاصی Oracle است که SQL را با قابلیت‌های برنامه‌نویسی ترکیب می‌کند.

با PL/SQL می‌توانید:

  • منطق‌های پیچیده دیتابیس را پیاده‌سازی کنید
  • عملیات‌های بزرگ را در قالب Procedure یا Function اجرا کنید
  • خطاهای دیتابیس را مدیریت کنید
  • روی داده‌ها به صورت ردیفی پردازش انجام دهید
  • Performance برنامه‌های دیتابیسی را افزایش دهید

ساختار کلی یک بلوک PL/SQL معمولاً به شکل زیر است:

				
					DECLARE
    -- define variables
BEGIN
    -- Logic app
EXCEPTION
    -- manage Errors
END;

				
			

مثال:

				
					DECLARE
    v_name VARCHAR2(50);
BEGIN
    v_name := 'Ali';
    DBMS_OUTPUT.PUT_LINE('Hello ' || v_name);
END;
				
			

یکی از مهم‌ترین ساختارهای برنامه‌نویسی در PL/SQL، دستورات شرطی IF هستند. با استفاده از IF می‌توانیم تصمیم بگیریم که چه کدی در چه شرایطی اجرا شود.

ساختار ساده IF

				
					IF condition THEN
   statements;
END IF;
				
			

مثال:

				
					DECLARE
    v_salary NUMBER := 12000;
BEGIN
    IF v_salary > ۱۰۰۰۰ THEN
        DBMS_OUTPUT.PUT_LINE('High salary');
    END IF;
END;
				
			

IF همراه با ELSE

در بسیاری از مواقع اگر شرط برقرار نباشد باید یک مسیر دیگر اجرا شود.

				
					IF condition THEN
    statements;
ELSE
    statements;
END IF;

				
			

مثال:

				
					DECLARE
    v_salary NUMBER := 8000;
BEGIN
    IF v_salary > ۱۰۰۰۰ THEN
        DBMS_OUTPUT.PUT_LINE('High salary');
    ELSE
        DBMS_OUTPUT.PUT_LINE('Normal salary');
    END IF;
END;
				
			

استفاده از ELSIF

اگر چند شرط مختلف داشته باشیم از ELSIF استفاده می‌کنیم.

				
					IF condition1 THEN
    statements;
ELSIF condition2 THEN
    statements;
ELSE
    statements;
END IF;
				
			

مثال:

				
					DECLARE
    v_salary NUMBER := 18000;
BEGIN
    IF v_salary >= ۲۰۰۰۰ THEN
        DBMS_OUTPUT.PUT_LINE('Level A');
    ELSIF v_salary >= ۱۵۰۰۰ THEN
        DBMS_OUTPUT.PUT_LINE('Level B');
    ELSE
        DBMS_OUTPUT.PUT_LINE('Level C');
    END IF;
END;
				
			

وقتی لازم باشد یک عملیات چندین بار تکرار شود از حلقه‌ها استفاده می‌کنیم. در PL/SQL سه نوع حلقه وجود دارد:

  • LOOP
  • WHILE LOOP
  • FOR LOOP

حلقه LOOP ساده

				
					LOOP
   statements;
   EXIT WHEN condition;
END LOOP;

				
			

مثال:

				
					DECLARE
    v_counter NUMBER := 1;
BEGIN
    LOOP
        DBMS_OUTPUT.PUT_LINE(v_counter);
        v_counter := v_counter + 1;

        EXIT WHEN v_counter > ۵;
    END LOOP;
END;
				
			

حلقه WHILE LOOP

در این نوع حلقه ابتدا شرط بررسی می‌شود.

				
					WHILE condition LOOP
   statements;
END LOOP;

				
			

مثال:

				
					DECLARE
    v_counter NUMBER := 1;
BEGIN
    WHILE v_counter <= 5 LOOP
        DBMS_OUTPUT.PUT_LINE(v_counter);
        v_counter := v_counter + 1;
    END LOOP;
END;
				
			

حلقه FOR LOOP

اگر تعداد تکرارها مشخص باشد، بهترین گزینه FOR LOOP است.

				
					FOR i IN 1..5 LOOP
   DBMS_OUTPUT.PUT_LINE(i);
END LOOP;
				
			

نسخه معکوس:

				
					FOR i IN REVERSE 1..5 LOOP
   DBMS_OUTPUT.PUT_LINE(i);
END LOOP;
				
			

وقتی یک Query چندین ردیف برمی‌گرداند، برای پردازش تک‌تک رکوردها از Cursor استفاده می‌کنیم.

در Oracle دو نوع Cursor داریم:

  • Implicit Cursor
  • Explicit Cursor

Implicit Cursor

وقتی یک دستور SQL اجرا می‌کنید، Oracle خودش یک Cursor ایجاد می‌کند.

مثال:

				
					BEGIN
    UPDATE employees
    SET salary = salary * 1.1
    WHERE department_id = 50;

    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT || ' rows updated');
END;
				
			

ویژگی‌های مهم Cursor:

  • SQL%ROWCOUNT
  • SQL%FOUND
  • SQL%NOTFOUND

Explicit Cursor

گاهی لازم است خودمان Cursor را تعریف کنیم.

مراحل استفاده از Cursor:

  1. تعریف Cursor
  2. باز کردن Cursor
  3. خواندن رکوردها
  4. بستن Cursor

مثال:

				
					DECLARE
    CURSOR c_emp IS
        SELECT employee_id, first_name
        FROM employees;

    v_id employees.employee_id%TYPE;
    v_name employees.first_name%TYPE;

BEGIN
    OPEN c_emp;

    LOOP
        FETCH c_emp INTO v_id, v_name;
        EXIT WHEN c_emp%NOTFOUND;

        DBMS_OUTPUT.PUT_LINE(v_id || ' ' || v_name);
    END LOOP;

    CLOSE c_emp;
END;
				
			

Cursor FOR LOOP (روش پیشنهادی)

در اکثر پروژه‌ها از Cursor FOR LOOP استفاده می‌شود چون ساده‌تر و امن‌تر است.

				
					BEGIN
    FOR r IN (
        SELECT employee_id, first_name, salary
        FROM employees
    ) LOOP
        DBMS_OUTPUT.PUT_LINE(
            r.employee_id || ' ' || r.first_name || ' ' || r.salary
        );
    END LOOP;
END;
				
			

در این روش:

  • Cursor خودکار باز می‌شود
  • FETCH خودکار انجام می‌شود
  • Cursor خودکار بسته می‌شود

در برنامه‌های واقعی همیشه احتمال بروز خطا وجود دارد. برای جلوگیری از متوقف شدن برنامه باید از مدیریت خطا استفاده کنیم.

ساختار کلی:

				
					BEGIN
   statements;
EXCEPTION
   WHEN exception_name THEN
       statements;
END;
				
			

خطاهای رایج در PL/SQL

چند Exception مهم در Oracle:

  • NO_DATA_FOUND
  • TOO_MANY_ROWS
  • ZERO_DIVIDE
  • VALUE_ERROR
  • DUP_VAL_ON_INDEX

مثال مدیریت NO_DATA_FOUND

				
					DECLARE
    v_salary NUMBER;
BEGIN
    SELECT salary
    INTO v_salary
    FROM employees
    WHERE employee_id = 999;

EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('Employee not found');
END;
				
			

مثال مدیریت ZERO_DIVIDE

				
					DECLARE
    v_result NUMBER;
BEGIN
    v_result := 10 / 0;

EXCEPTION
    WHEN ZERO_DIVIDE THEN
        DBMS_OUTPUT.PUT_LINE('Division by zero error');
END;
				
			

مثال مدیریت WHEN OTHERS

برای گرفتن همه خطاهای دیگر:

				
					BEGIN
   -- some code
EXCEPTION
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
				
			

توابع مفید:

  • SQLCODE → کد خطا
  • SQLERRM → پیام خطا

ترکیبی IF + LOOP + CURSOR

در این مثال حقوق کارمندان بررسی می‌شود.

				
					BEGIN
    FOR r IN (
        SELECT employee_id, first_name, salary
        FROM employees
    ) LOOP

        IF r.salary < 5000 THEN
            DBMS_OUTPUT.PUT_LINE(r.first_name || ' Low salary');

        ELSIF r.salary <= 15000 THEN
            DBMS_OUTPUT.PUT_LINE(r.first_name || ' Normal salary');

        ELSE
            DBMS_OUTPUT.PUT_LINE(r.first_name || ' High salary');
        END IF;

    END LOOP;
END;
				
			

چند نکته حرفه‌ای در PL/SQL

اگر می‌خواهید حرفه‌ای‌تر کدنویسی کنید این نکات بسیار مهم هستند:

  • همیشه از %TYPE برای تعریف نوع متغیر استفاده کنید
  • اگر امکان دارد عملیات را با یک SQL انجام دهید نه Loop
  • خطاها را با Exception Handling مدیریت کنید
  • از Cursor FOR LOOP برای خوانایی بیشتر استفاده کنید
  • خطاها را در جدول Log ذخیره کنید

سوالات متداول درباره PL/SQL در اوراکل

PL/SQL زبان برنامه‌نویسی اختصاصی Oracle است که SQL را با قابلیت‌های برنامه‌نویسی ترکیب می‌کند.

در حالی که SQL فقط برای کار با داده‌ها (مثل SELECT، INSERT، UPDATE و DELETE) استفاده می‌شود، PL/SQL امکانات بیشتری مثل شرط‌ها (IF)، حلقه‌ها (LOOP)، مدیریت خطا (Exception Handling) و تعریف Procedure و Function را فراهم می‌کند.

به همین دلیل در پروژه‌های واقعی Oracle معمولاً از PL/SQL برای پیاده‌سازی منطق برنامه استفاده می‌شود.

Cursor در PL/SQL ابزاری است که برای پردازش رکوردهای برگشتی از یک Query استفاده می‌شود. وقتی یک دستور SELECT چندین ردیف داده برمی‌گرداند، Cursor به شما اجازه می‌دهد هر رکورد را به‌صورت جداگانه پردازش کنید. در Oracle دو نوع Cursor وجود دارد:

  • Implicit Cursor (خودکار توسط Oracle)
  • Explicit Cursor (تعریف‌شده توسط برنامه‌نویس)

در بیشتر موارد برای سادگی و خوانایی بهتر از Cursor FOR LOOP استفاده می‌شود.

Exception Handling در PL/SQL برای مدیریت خطاهایی استفاده می‌شود که هنگام اجرای برنامه رخ می‌دهند.

بدون مدیریت خطا، برنامه در صورت بروز مشکل متوقف می‌شود. با استفاده از بلوک EXCEPTION می‌توان خطاهایی مثل NO_DATA_FOUND، TOO_MANY_ROWS یا ZERO_DIVIDE را کنترل کرد و پیام مناسب نمایش داد یا عملیات جایگزین انجام داد.

در PL/SQL سه نوع حلقه وجود دارد: LOOP، WHILE LOOP و FOR LOOP.

اگر تعداد تکرارها مشخص باشد، FOR LOOP بهترین انتخاب است زیرا کدنویسی ساده‌تر و خواناتری دارد.

همچنین برای پردازش رکوردهای Query معمولاً از Cursor FOR LOOP استفاده می‌شود که به صورت خودکار Cursor را باز و بسته می‌کند و احتمال خطا را کاهش می‌دهد.

جمع‌بندی

PL/SQL یکی از مهم‌ترین ابزارها برای توسعه روی Oracle Database است. چهار مفهوم پایه که بررسی کردیم تقریباً در تمام پروژه‌های واقعی استفاده می‌شوند:

  • IF برای تصمیم‌گیری
  • LOOP برای تکرار عملیات
  • CURSOR برای پردازش چند رکورد
  • Exception Handling برای مدیریت خطا

اگر این چهار مفهوم را خوب یاد بگیرید، می‌توانید بسیاری از Procedureها، Jobها و برنامه‌های دیتابیسی حرفه‌ای را پیاده‌سازی کنید.

سؤالی درباره این مقاله داری؟

اگر نکته‌ای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفت‌وگوی واقعی 💬

برو به صفحه پرسش و پاسخ

میثم راد

من یه برنامه نویسم که حسابی با دیتابیس اوراکل رفیقم! از اونایی ام که تا چیزی رو کامل نفهمم،ول کن نیستم، یادگرفتن برام مثل بازیه، و نوشتن اینجا کمک می کنه تا چیزایی که یاد گرفتم رو با بقیه به شریک بشم، با هم پیشرفت کنیم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *