
اگر با PL/SQL اوراکل کار کرده باشی، حتماً به این نقطه رسیدهای که بخواهی:
- دادهای را موقتی نگه داری
- سرعت پردازش را بالا ببری
- از Query زدنهای اضافی جلوگیری کنی
- یا Cursorهای سنگین را کنار بگذاری
اینجاست که Associative Array مثل یک ابزار نجات ظاهر میشود.
این ساختار، یکی از مهمترین Collectionهای Oracle است که متأسفانه خیلیها یا درست نمیشناسندش یا بد استفاده میکنند.
در این مقاله آموزش اوراکل از بخش آموزش برنامه نویسی دیتابیس، Associative Array را صفر تا صد، روان، با مثالهای واقعی یاد میگیری؛ دقیقاً طوری که در پروژه استفادهاش کنی.
در این جور مواقع، یکی از ابزارهای قدرتمند Oracle به نام VARRAY (Variable-size Array) حسابی به کارت میآید. پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.
در این مقاله شما می خوانید
Associative Array در Oracle چیست؟
Associative Array (که اسم قدیمیاش Index‑By Table است) یک نوع Collection در PL/SQL است که:
- فقط در حافظه (PGA) قرار میگیرد
- در دیتابیس ذخیره نمیشود
- برای نگهداری موقتی دادهها استفاده میشود
- بهصورت کلید → مقدار (Key‑Value) کار میکند
بهزبان ساده:
Associative Array شبیه یک Map یا Dictionary است که فقط داخل PL/SQL زندگی میکند.
تعریف کلی Associative Array
ساختار کلی تعریف آن به شکل زیر است:
TYPE type_name IS TABLE OF data_type INDEX BY index_type;
دو بخش مهم:
data_type➜ نوع دیتایی که ذخیره میشودindex_type➜ نوع کلید (عددی یا رشتهای)
مثالی از Associative Array عددی
DECLARE
TYPE t_numbers IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
l_numbers t_numbers;
BEGIN
l_numbers(1) := 100;
l_numbers(5) := 500;
l_numbers(20) := 2000;
DBMS_OUTPUT.PUT_LINE(l_numbers(5));
END;
✅ نکته مهم:
نیازی نیست اندیسها پشتسرهم باشند؛ Oracle این را مدیریت میکند.
مثالی از Associative Array با کلید رشتهای
این مدل دقیقاً همان چیزی است که در پروژهها زیاد میبینیم:
DECLARE
TYPE t_salary IS TABLE OF NUMBER INDEX BY VARCHAR2(50);
l_salary t_salary;
BEGIN
l_salary('ALI') := 12000;
l_salary('SARA') := 18000;
DBMS_OUTPUT.PUT_LINE(l_salary('ALI'));
END;
📌 کاربرد واقعی:
- مپ کردن username به اطلاعات
- نگه داشتن تنظیمات کاربر
- حذف Queryهای تکراری از دیتابیس
تفاوت Associative Array با Nested Table و VARRAY
Associative Array
- فقط در PL/SQL
- ذخیره در DB ندارد
- اندیس رشتهای دارد
- بسیار سریع
Nested Table
- قابل ذخیره در دیتابیس
- قابل استفاده در SQL
VARRAY
- اندازه محدود
- ترتیب عناصر مهم است
✅ برای پردازش سریع موقتی → Associative Array بهترین انتخاب است.
پر کردن Associative Array از Query (روش معمول)
DECLARE
TYPE t_names IS TABLE OF employees.first_name%TYPE
INDEX BY PLS_INTEGER;
l_names t_names;
i PLS_INTEGER := 0;
BEGIN
FOR r IN (SELECT first_name FROM employees) LOOP
i := i + 1;
l_names(i) := r.first_name;
END LOOP;
DBMS_OUTPUT.PUT_LINE(l_names(1));
END;
پر کردن Associative Array از BULK COLLECT (روش حرفهای و سریع)
اگر Performance مهم است، حتماً از این روش استفاده کن:
DECLARE
TYPE t_names IS TABLE OF employees.first_name%TYPE
INDEX BY PLS_INTEGER;
l_names t_names;
BEGIN
SELECT first_name
BULK COLLECT INTO l_names
FROM employees;
DBMS_OUTPUT.PUT_LINE(l_names(1));
END;
✅ مزیت بزرگ:
- کاهش Context Switch
- اجرای سریعتر نسبت به Loop
متدهای مهم Associative Array
فرض کن اسم آرایه l_arr است.
COUNT
تعداد عناصر موجود:
l_arr.COUNT
EXISTS
چک کردن وجود یک اندیس:
IF l_arr.EXISTS(10) THEN
DBMS_OUTPUT.PUT_LINE(l_arr(10));
END IF;
FIRST و LAST
اولین و آخرین اندیس:
l_arr.FIRST
l_arr.LAST
NEXT و PRIOR (بهترین روش Loop)
DECLARE
i PLS_INTEGER;
BEGIN
i := l_arr.FIRST;
WHILE i IS NOT NULL LOOP
DBMS_OUTPUT.PUT_LINE(l_arr(i));
i := l_arr.NEXT(i);
END LOOP;
END;
✅ امن، خوانا و حرفهای.
DELETE
حذف عناصر:
l_arr.DELETE; -- حذف کل آرایه
l_arr.DELETE(3); -- حذف یک عنصر
l_arr.DELETE(2,5); -- حذف بازه
Associative Array با %ROWTYPE
DECLARE
TYPE t_emp IS TABLE OF employees%ROWTYPE
INDEX BY PLS_INTEGER;
l_emp t_emp;
BEGIN
SELECT *
BULK COLLECT INTO l_emp
FROM employees;
DBMS_OUTPUT.PUT_LINE(l_emp(1).first_name);
END;
📌 عالی برای:
- پردازش رکورد کامل
- جایگزینی Cursorهای سنگین
استفاده از Associative Array در Package
PACKAGE emp_pkg IS
TYPE t_emp IS TABLE OF employees%ROWTYPE
INDEX BY PLS_INTEGER;
END emp_pkg;
✅ کاملاً استاندارد در پروژههای Enterprise.
چه زمانی از Associative Array استفاده نکنیم؟
❌ اگر:
- داده باید دائمی ذخیره شود
- بخواهیم در SQL Join بزنیم
- داده بین Sessionها مشترک باشد
✅ در این شرایط:
- Nested Table
- Global Temporary Table
سوالات متداول درباره Associative Array در اوراکل (pl/sql)
Associative Array یکی از Collectionهای PL/SQL است که فقط در حافظه اجرا میشود و برای نگهداری موقت دادهها کاربرد دارد.
برخلاف Nested Table، Associative Array:
- در دیتابیس ذخیره نمیشود
- مستقیماً در SQL قابل استفاده نیست
- میتواند اندیس رشتهای داشته باشد
- سرعت بالاتری در پردازشهای موقتی دارد
✅ اگر سرعت و پردازش در حافظه مهم است، Associative Array انتخاب بهتری است.
بهترین زمان استفاده از Associative Array زمانی است که:
- داده فقط در طول اجرای کد نیاز است
- نمیخواهید جدول موقت بسازید
- حجم داده مشخص نیست
- به Performance بالا نیاز دارید
✅ بهطور خاص، برای Bulk Processing و جایگزینی Cursorهای سنگین، Associative Array بسیار عالی عمل میکند.
تفاوت اصلی این دو در ساختار و کاربرد آنهاست:
Associative Array
- سایز داینامیک
- اندیس عددی یا رشتهای
- فقط در PL/SQL
- مناسب دادههای موقتی
VARRAY
- سایز ثابت
- ترتیب عناصر مهم است
- قابل ذخیره در دیتابیس
✅ اگر ترتیب مهم نیست و سایز مشخصی ندارید، Associative Array انتخاب منطقیتری است.
بهترین و امنترین روش پیمایش Associative Array استفاده از متدهای FIRST و NEXT است:
i := l_arr.FIRST;
WHILE i IS NOT NULL LOOP
DBMS_OUTPUT.PUT_LINE(l_arr(i));
i := l_arr.NEXT(i);
END LOOP;
✅ این روش:
- مستقل از پشتسرهم بودن اندیسهاست
- از خطای ORA‑۰۶۵۳۰ جلوگیری میکند
- حرفهایترین روش توصیهشده توسط Oracle است
جمعبندی
اگر PL/SQL را جدی کار میکنی، Associative Array یک ابزار لوکس نیست، یک ضرورت است.
با استفاده درست از آن:
- سرعت بالا میرود
- کد تمیزتر میشود
- فشار روی دیتابیس کمتر میشود
یاد گرفتنش شاید ساده بهنظر بیاید، اما بلد بودنِ درستِ آن، نشانه حرفهای بودن است.
📥 اگر سوالی داری در مورد Associative Array در اوراکل داری، در بخش کامنتها بپرس.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید