
اگر با 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:
- تعریف Cursor
- باز کردن Cursor
- خواندن رکوردها
- بستن 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ها و برنامههای دیتابیسی حرفهای را پیادهسازی کنید.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید