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