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

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

Associative Array در Oracle چیست؟

اگر با 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 در اوراکل داری، در بخش کامنت‌ها بپرس.

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

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

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

میثم راد

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

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

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