
اگر با Oracle و PL/SQL کار کرده باشی، خیلی زود به این نتیجه میرسی که نوشتن کد حرفهای فقط به دانستن SELECT و JOIN خلاصه نمیشود. جایی میرسی که باید با حجم زیادی از دادهها بهصورت سریع و بهینه کار کنی؛ دقیقاً همینجا است که Collection در Oracle وارد بازی میشود.
در این مقاله آموزش Oracle در بخش آموزش PL/SQL ،قرار است Collection را:
- کاملاً مفهومی بفهمی
- کاربردی و پروژهمحور یاد بگیری
- با مثالهایی که واقعاً در پروژه استفاده میشوند
برای نوشتن Dynamic SQL امن و بهینه در Oracle باید از EXECUTE IMMEDIATE یا DBMS_SQL بهدرستی استفاده کنید، ورودیها را اعتبارسنجی کنید، از Bind Variable بهره ببرید، و اجرای کد را با Exception Handling امن نگه دارید. پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.
در این مقاله شما می خوانید
Collection در Oracle چیست؟
به زبان ساده:
Collection یعنی یک متغیر که میتواند چند مقدار همنوع را بهصورت گروهی در حافظه نگه دارد.
یعنی بهجای این که دهها متغیر جداگانه داشته باشی، همه دادهها را داخل یک Collection میریزی و خیلی تمیز و سریع با آنها کار میکنی.
مقایسه ذهنی:
- Java → List / Array
- Python → list
- Oracle PL/SQL → Collection
انواع Collection در Oracle
Oracle سه نوع Collection دارد:
هرکدام را جداگانه، با مثال درست بررسی میکنیم.
Associative Array در Oracle
DECLARE
TYPE t_email IS TABLE OF VARCHAR2(100) INDEX BY VARCHAR2(50);
v_email t_email;
BEGIN
v_email('Ali') := 'ali@test.com';
v_email('Sara') := 'sara@test.com';
DBMS_OUTPUT.PUT_LINE(v_email('Sara'));
END;
📌 این دقیقاً مثل Dictionary است.
پیمایش و خواندن در Associative Array
DECLARE
TYPE t_data IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
v_data t_data;
i PLS_INTEGER;
BEGIN
v_data(100) := 10;
v_data(200) := 20;
i := v_data.FIRST;
WHILE i IS NOT NULL LOOP
DBMS_OUTPUT.PUT_LINE('Index='||i||' Value='||v_data(i));
i := v_data.NEXT(i);
END LOOP;
END;
چه زمانی از Associative Array استفاده کنیم؟
✅ پردازش سریع
✅ Key‑Value
✅ فقط PL/SQL
❌ قابل ذخیره در جدول نیست
Nested Table در Oracle
Nested Table یک Collection خیلی مهم است چون هم در PL/SQL و هم در SQL قابل استفاده است.
تعریف نوع Nested Table
CREATE TYPE t_number_tab AS TABLE OF NUMBER;
استفاده در PL/SQL
DECLARE
v_numbers t_number_tab := t_number_tab(10,20,30);
BEGIN
DBMS_OUTPUT.PUT_LINE(v_numbers(1));
END;
متدهای مهم Nested Table
COUNT→ تعداد عناصرEXTEND→ اضافه کردن عنصر جدیدDELETE→ حذف عنصرFIRST / LAST→ اولین و آخرین IndexEXISTS→ بررسی وجود Index
مثال : اضافه کردن و حذف داده در Nested Table
DECLARE
v_numbers t_number_tab := t_number_tab();
BEGIN
v_numbers.EXTEND(2);
v_numbers(1) := 100;
v_numbers(2) := 200;
v_numbers.DELETE(1);
DBMS_OUTPUT.PUT_LINE(v_numbers.COUNT);
END;
استفاده از Nested Table در جدول دیتابیس
CREATE TABLE orders (
order_id NUMBER,
product_ids t_number_tab
)
NESTED TABLE product_ids STORE AS product_ids_nt;
📌 مناسب برای مدلسازی دادههای یک به چند بدون جدول واسط سنگین.
VARRAY در Oracle
VARRAY یعنی Collection با حداکثر اندازه مشخص
تعریف VARRAY
CREATE TYPE t_scores AS VARRAY(5) OF NUMBER;
استفاده VARRAY
DECLARE
v_scores t_scores := t_scores(15,18,20);
BEGIN
DBMS_OUTPUT.PUT_LINE(v_scores(3));
END;
محدودیت VARRAY
اگر بیشتر از ۵ آیتم اضافه شود:
ORA-22165: given index is out of range
چه زمانی VARRAY مناسب است؟
✅ لیست کوتاه
✅ دادههای ثابت
❌ داده زیاد یا داینامیک
مقایسه سریع Collectionها
- Associative Array → فقط PL/SQL، سریع
- Nested Table → SQL + PL/SQL، بدون محدودیت
- VARRAY → SQL + PL/SQL، اندازه محدود
Collection و Performance
BULK COLLECT
DECLARE
TYPE t_emp IS TABLE OF employees%ROWTYPE;
v_emp t_emp;
BEGIN
SELECT *
BULK COLLECT INTO v_emp
FROM employees;
FOR i IN 1 .. v_emp.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(v_emp(i).employee_id);
END LOOP;
END;
✅ کاهش Context Switch
✅ افزایش شدید سرعت
FORALL
DECLARE
TYPE t_ids IS TABLE OF NUMBER;
v_ids t_ids := t_ids(1,3,5);
BEGIN
FORALL i IN 1 .. v_ids.COUNT
DELETE FROM employees
WHERE employee_id = v_ids(i);
END;
📌 این دقیقاً چیزی است که در پروژههای واقعی استفاده میشود.
نکات طلایی از تجربه پروژه های انجام شده
- فقط PL/SQL → Associative Array
- نیاز به SQL → Nested Table
- حجم کم → VARRAY
- Performance مهم → BULK COLLECT + FORALL
سوالات متداول درباره Collection در اوراکل (pl/sql)
Collection در Oracle یک ساختار دادهای در PL/SQL است که امکان ذخیره چند مقدار همنوع را بهصورت گروهی فراهم میکند.
برخلاف Arrayهای ساده، Collectionها قابلیتهایی مثل افزایش یا کاهش اندازه در زمان اجرا، استفاده در SQL (در Nested Table و VARRAY) و پردازش سریع دادهها در حافظه را دارند.
همین ویژگیها باعث شده Collection به یک ابزار کلیدی برای نوشتن کدهای حرفهای و بهینه در Oracle تبدیل شود.
در Oracle سه نوع Collection وجود دارد که هرکدام کاربرد خاص خودشان را دارند:
- Associative Array فقط در PL/SQL استفاده میشود، بسیار سریع است و برای پردازشهای حافظهای مناسب است.
- Nested Table هم در PL/SQL و هم در SQL قابل استفاده است و میتواند در جدول دیتابیس ذخیره شود.
- VARRAY اندازه مشخص دارد و برای لیستهای کوچک و ثابت مناسب است.
انتخاب نوع Collection تأثیر مستقیمی روی خوانایی کد، عملکرد و طراحی دیتابیس دارد.
زمانی که قرار است حجم زیادی از دادهها را پردازش کنید، استفاده از BULK COLLECT و FORALL ضروری میشود.
BULK COLLECT دادهها را یکجا داخل Collection میریزد و FORALL عملیات DML را بهصورت دستهای اجرا میکند.
این کار باعث کاهش شدید Context Switch بین SQL و PL/SQL شده و Performance را چند برابر بهتر میکند؛ بهخصوص در پروژههای Enterprise.
اگر تمرکز اصلی روی Performance باشد، معمولاً Associative Array بهترین انتخاب است، چون کاملاً حافظهای است و سربار SQL ندارد.
اما اگر نیاز به استفاده در SQL یا ذخیره در دیتابیس داشته باشید، Nested Table همراه با BULK COLLECT و FORALL بهترین ترکیب برای رسیدن به عملکرد بالا و طراحی اصولی محسوب میشود.
جمعبندی
اگر Collection را درست یاد بگیری، نصف راه حرفهای شدن در PL/SQL را رفتهای.
کدی که بدون Collection نوشته شود:
- کندتر است
- سختتر نگهداری میشود
- مقیاسپذیر نیست
📥 اگر سوالی داری در مورد Collection در اوراکل داری، در بخش کامنتها بپرس.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید