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

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

VARRAY در Oracle چیست؟

اگر با Oracle Database کار کرده باشی، حتماً به این مسئله برخورد کردی که بعضی داده‌ها تکی نیستند؛

مثلاً یک کارمند چند شماره تلفن دارد یا یک دانشجو چند نمره.

در این جور مواقع، یکی از ابزارهای قدرتمند Oracle به نام VARRAY (Variable-size Array) حسابی به کارت می‌آید.

در این مقاله آموزش Oracle در بخش آموزش PL/SQL :

  • VARRAY را مفهومی و عمیق می‌شناسیم
  • یاد می‌گیریم کِی استفاده کنیم و کِی نکنیم
  • با مثال‌های واقعی و درست تمرین می‌کنیم
  • و در پایان، دید DBA و Developer را با هم ترکیب می‌کنیم.

اگر با Oracle و PL/SQL کار کرده باشی، خیلی زود به این نتیجه می‌رسی که نوشتن کد حرفه‌ای فقط به دانستن SELECT و JOIN خلاصه نمی‌شود. جایی می‌رسی که باید با حجم زیادی از داده‌ها به‌صورت سریع و بهینه کار کنی؛ دقیقاً همین‌جا است که Collection در Oracle وارد بازی می‌شود. پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.

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

VARRAY در Oracle چیست؟

VARRAY یک نوع داده‌ی Collection در Oracle است که:

  • از چند عنصر هم‌نوع (Same Data Type) تشکیل شده
  • ترتیب عناصر در آن مهم است (Ordered)
  • دارای حداکثر تعداد مشخص (LIMIT) است
  • معمولاً همراه با خود رکورد جدول ذخیره می‌شود

📌 تعریف انسان‌گونه:

VARRAY یعنی «یک آرایه‌ی کوچک، مرتب و محدود که Oracle می‌تواند آن را داخل دیتابیس ذخیره کند.»

چرا باید از VARRAY در Oracle استفاده کنیم؟

چون در دنیای واقعی:

  • بعضی داده‌ها به یک رکورد وابسته هستند
  • تعدادشان کم و مشخص است
  • و معمولاً همیشه با هم خوانده می‌شوند

✅ مثال‌های رایج:

  • شماره تلفن‌های یک کارمند
  • ایمیل‌های محدود یک کاربر
  • نمرات یک دانشجو در یک درس
  • رنگ‌های قابل انتخاب یک محصول

نحوه ساخت VARRAY در Oracle

تعریف TYPE برای VARRAY

				
					CREATE TYPE phone_list_t AS VARRAY(3)
OF VARCHAR2(20);

				
			

توضیح:

  • VARRAY(3) حداکثر ۳ عنصر
  • VARCHAR2(20) نوع هر عنصر
  • phone_list_t یک نوع داده قابل استفاده در جدول و PL/SQL

استفاده از VARRAY در جدول Oracle

مثال عملی: ذخیره شماره تلفن کارمندان

				
					CREATE TABLE employees (
    emp_id   NUMBER,
    emp_name VARCHAR2(50),
    phones   phone_list_t
);

				
			

درج داده داخل VARRAY

				
					INSERT INTO employees VALUES (
    ۱,
    'Ali',
    phone_list_t('09120000000', '02188888888')
);

				
			
  • ✅ کاملاً معتبر
  • ✅ ترتیب حفظ می‌شود
  • ✅ کمتر از LIMIT است

خطای رایج: پر شدن ظرفیت VARRAY

				
					INSERT INTO employees VALUES (
    ۲,
    'Reza',
    phone_list_t('1','2','3','4')
);

				
			

❌ خطا:

				
					ORA-22165: given index [4] must be in range of size [3]

				
			

📌 چون VARRAY بیشتر از ۳ آیتم قبول نمی‌کند.

دسترسی به عناصر VARRAY در Oracle

خواندن عنصر خاص از VARRAY

				
					SELECT e.phones(1) AS first_phone
FROM employees e
WHERE emp_id = 1;

				
			

⚠️ نکته مهم: اندیس‌ها در Oracle از ۱ شروع می‌شوند (نه ۰).

کار با VARRAY در PL/SQL

تعریف و استفاده از VARRAY در بلاک PL/SQL

				
					DECLARE
    v_phones phone_list_t;
BEGIN
    v_phones := phone_list_t('0912', '0935');

    DBMS_OUTPUT.PUT_LINE(v_phones(1));
END;
				
			

متدهای مهم VARRAY در اوراکل

🔹 COUNT – تعداد عناصر فعلی

				
					v_phones.COUNT

				
			

🔹 LIMIT – حداکثر ظرفیت VARRAY

				
					v_phones.LIMIT

				
			

VARRAY همیشه LIMIT دارد.

🔹 EXTEND – اضافه کردن عنصر جدید

				
					v_phones.EXTEND;
v_phones(3) := '0999';

				
			

❌ اگر از LIMIT عبور کنی → خطا می‌گیری.

مثال کامل با متدها

				
					DECLARE
   TYPE num_varray_t IS VARRAY(5) OF NUMBER;
   v_nums num_varray_t := num_varray_t(10, 20);
BEGIN
   DBMS_OUTPUT.PUT_LINE(v_nums.COUNT); -- 2
   DBMS_OUTPUT.PUT_LINE(v_nums.LIMIT); -- 5

   v_nums.EXTEND;
   v_nums(3) := 30;
END;
				
			

حذف عناصر در VARRAY

فقط از انتهای آرایه

				
					v_nums.TRIM;    -- hazf akharin ozv
v_nums.TRIM(2); -- hazf 2 ozv akhar

				
			

📌 حذف عنصر وسط وجود ندارد

برای این کار باید کل VARRAY را دوباره بسازی.

تفاوت VARRAY خالی و NULL

				
					phones IS NULL

				
			

🔹 یعنی اصلاً VARRAY وجود ندارد.

				
					phones = phone_list_t()

				
			

🔹 یعنی VARRAY وجود دارد ولی خالی است.

⚠️ این تفاوت در شرط‌ها و منطق برنامه بسیار مهم است.

ذخیره‌سازی VARRAY در Oracle (دید DBA)

  • VARRAY معمولاً INLINE در خود رکورد ذخیره می‌شود
  • برای داده‌های کوچک بسیار بهینه است
  • اگر بیش از حد بزرگ شود:
    • Redo و Undo زیاد
    • Performance افت می‌کند

چه زمانی VARRAY انتخاب درستی است؟

✅ وقتی:

    • تعداد عناصر کم و مشخص است
    • ترتیب عناصر اهمیت دارد
    • داده‌ها همیشه همراه رکورد اصلی استفاده می‌شوند

چه زمانی VARRAY انتخاب بدی است؟

❌ وقتی:

  • تعداد عناصر نامحدود است
  • نیاز به JOIN جداگانه داری
  • عملیات حذف و اضافه زیاد انجام می‌شود

در این شرایط:

👉 Nested Table یا جدول جدا با Foreign Key انتخاب بهتری است.

سوالات متداول درباره VARRAY در اوراکل (pl/sql)

VARRAY (Variable-size Array) یکی از انواع Collection در Oracle است که برای نگهداری چند مقدار هم‌نوع به‌صورت مرتب و با حداکثر اندازه مشخص استفاده می‌شود.

بهتر است از VARRAY زمانی استفاده کنیم که:

  • تعداد داده‌ها کم و محدود است
  • ترتیب عناصر اهمیت دارد
  • داده‌ها همیشه همراه با رکورد اصلی خوانده می‌شوند

مثلاً برای ذخیره شماره تلفن‌های یک کارمند یا نمرات یک درس، VARRAY انتخاب بسیار مناسبی است.

مهم‌ترین تفاوت این دو در محدودیت اندازه و نحوه ذخیره‌سازی است.

VARRAY دارای حداکثر اندازه مشخص (LIMIT) است و معمولاً در خود رکورد ذخیره می‌شود، در حالی که Nested Table:

  • محدودیت تعداد ندارد
  • در جدول جداگانه ذخیره می‌شود
  • برای داده‌های پرتعداد و پویا مناسب‌تر است

اگر داده‌ها کم، ثابت و وابسته به رکورد هستند → VARRAY

اگر داده‌ها زیاد و قابل توسعه هستند → Nested Table

به‌صورت مستقیم، VARRAY برای JOIN و جستجوی سنگین طراحی نشده است.

هرچند می‌توان با توابع خاص و CAST آن را به جدول تبدیل کرد، اما این کار:

  • پیچیده‌تر است
  • پرفورمنس را کاهش می‌دهد

اگر نیاز به JOIN، فیلتر و آمارگیری زیاد روی داده‌ها دارید، استفاده از Nested Table یا جدول جداگانه با Foreign Key انتخاب حرفه‌ای‌تری است.

  • COUNT تعداد عناصر موجود در VARRAY را نشان می‌دهد
  • LIMIT حداکثر ظرفیتی است که VARRAY می‌تواند داشته باشد

مثلاً اگر یک VARRAY با VARRAY(5) تعریف شده باشد:

  • LIMIT همیشه ۵ است
  • COUNT ممکن است بین ۰ تا ۵ تغییر کند

دانستن این تفاوت برای جلوگیری از خطاهای زمان اجرا (مثل ORA‑۲۲۱۶۵) بسیار مهم است.

جمع‌بندی

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

**VARRAY ابزار فوق‌العاده‌ای برای نگهداری داده‌های کوچک، مرتب و وابسته به رکورد است؛

اما اگر بی‌جا استفاده شود، می‌تواند به پرفورمنس دیتابیس آسیب بزند.**

📥 اگر سوالی داری در مورد VARRAY در اوراکل داری، در بخش کامنت‌ها بپرس.

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

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

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

میثم راد

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

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

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