
در طراحی پایگاه داده، معمولاً با ساختاری سروکار داریم که یک رکورد، چند مقدار وابسته دارد.
مثلاً یک مشتری چند شماره تماس دارد یا یک سفارش شامل چند آیتم مختلف است.
در حالت سنتی، این مشکل با ایجاد جدول جدا و استفاده از JOIN حل میشود؛ اما Oracle قابلیتی قدرتمند در اختیار ما گذاشته به نام Nested Table که امکان نگهداری مجموعهای از دادهها را داخل یک ستون فراهم میکند.
در این مقاله آموزش Oracle در بخش آموزش PL/SQL ، بهصورت کامل و کاربردی بررسی میکنیم:
- Nested Table چیست
- چگونه تعریف و استفاده میشود
- متدهای آن چه هستند
- چه زمانی باید (و نباید) از آن استفاده کرد
اگر با Oracle و PL/SQL کار کرده باشی، خیلی زود به این نتیجه میرسی که نوشتن کد حرفهای فقط به دانستن SELECT و JOIN خلاصه نمیشود. جایی میرسی که باید با حجم زیادی از دادهها بهصورت سریع و بهینه کار کنی؛ دقیقاً همینجا است که Collection در Oracle وارد بازی میشود. پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.
در این مقاله شما می خوانید
Nested Table در Oracle چیست؟
Nested Table یکی از انواع Collection در Oracle Database است که اجازه میدهد چند مقدار (چند سطر منطقی) بهصورت یک مجموعه در داخل یک ستون ذخیره شوند.
به زبان ساده:
Nested Table یعنی یک جدول منطقی که داخل یک ستون زندگی میکند.
ویژگیهای کلیدی Nested Table:
- میتواند صفر یا چند عنصر داشته باشد
- از نظر فیزیکی در یک جدول جدا ذخیره میشود
- از نظر منطقی وابسته به رکورد والد است
- محدودیت تعداد عناصر ندارد
- روی دادههای آن میتوان Query اجرا کرد
ساخت Nested Table (مرحلهبهمرحله)
تعریف TYPE
ابتدا باید نوع Nested Table را تعریف کنیم:
CREATE TYPE phone_list_t AS TABLE OF VARCHAR2(20);
استفاده از Nested Table در جدول
CREATE TABLE customers (
customer_id NUMBER,
name VARCHAR2(100),
phones phone_list_t
)
NESTED TABLE phones STORE AS customers_phones_nt;
در این مرحله:
ستون phones یک Nested Table است
اوراکل بهصورت خودکار یک جدول فیزیکی برای آن ایجاد میکند
درج داده در Nested Table
INSERT INTO customers VALUES (
۱,
'Ali',
phone_list_t('0912', '0935', '0901')
);
متدهای Nested Table در Oracle (Collection Methods)
Oracle متدهایی در اختیار ما گذاشته که کار با Nested Table را ساده و استاندارد میکند.
✅ COUNT
تعداد عناصر موجود در Nested Table را برمیگرداند:
phones.COUNT;
✅ EXTEND
برای افزودن عنصر جدید:
phones.EXTEND;
phones(phones.COUNT) := '0990';
برای افزودن چند عنصر:
phones.EXTEND(2);
✅ DELETE
حذف دادهها از Nested Table:
حذف همه عناصر:
phones.DELETE;
حذف یک عنصر خاص:
phones.DELETE(2);
حذف بازهای از عناصر:
phones.DELETE(2, 4);
نکته مهم: بعد از DELETE، اندیسها ممکن است پیوسته نباشند.
✅ EXISTS
بررسی وجود اندیس (خیلی مهم هنگام Loop):
IF phones.EXISTS(3) THEN
DBMS_OUTPUT.PUT_LINE(phones(3));
END IF;
✅ FIRST و LAST
دریافت اولین و آخرین اندیس موجود:
phones.FIRST;
phones.LAST;
اگر Nested Table خالی باشد، مقدار NULL برمیگردد.
✅ NEXT و PRIOR
برای پیمایش امن روی Nested Table (روش صحیح Loop زدن):
i := phones.FIRST;
WHILE i IS NOT NULL LOOP
DBMS_OUTPUT.PUT_LINE(phones(i));
i := phones.NEXT(i);
END LOOP;
✅ TRIM
حذف عنصر یا عناصر از انتهای Nested Table:
phones.TRIM;
phones.TRIM(2);
❌ LIMIT
Nested Table تابع LIMIT ندارد چون اندازه آن نامحدود است.
مثال کاربردی از Nested Table
DECLARE
phones phone_list_t := phone_list_t('0912', '0935', '0901');
i PLS_INTEGER;
BEGIN
phones.DELETE(2);
i := phones.FIRST;
WHILE i IS NOT NULL LOOP
DBMS_OUTPUT.PUT_LINE(
'Index=' || i || ' Value=' || phones(i)
);
i := phones.NEXT(i);
END LOOP;
DBMS_OUTPUT.PUT_LINE('Count=' || phones.COUNT);
END;
چه زمانی از Nested Table استفاده کنیم؟
✅ مناسب است اگر:
- دادهها ماهیت لیستی دارند
- دادهها وابسته به یک رکورد خاص هستند
- میخواهید از Joinهای غیرضروری جلوگیری کنید
- مدل داده خواناتر شود
❌ مناسب نیست اگر:
- سیستم OLTP بسیار پرفشار دارید
- نیاز به Queryهای خیلی پیچیده و سنگین دارید
- تیم توسعه با Collectionها آشنا نیست
سوالات متداول درباره Nested Table در اوراکل (pl/sql)
Nested Table نوعی Collection در اوراکل است که اجازه میدهد چند مقدار یا چند رکورد منطقی داخل یک ستون از جدول ذخیره شوند.
در حالی که جدول معمولی هر رکورد را در یک سطر مستقل نگه میدارد، Nested Table دادههای وابسته را بهصورت لیستی کنار هم قرار میدهد و از نظر فیزیکی در یک جدول جدا ذخیره میکند.
این ویژگی باعث میشود در برخی سناریوها نیاز به JOIN کاهش پیدا کند و طراحی داده طبیعیتر شود.
وقتی دادهها ماهیت چندمقداری و وابسته به یک رکورد دارند، Nested Table انتخاب مناسبی است.
مثلاً:
- شماره تلفنهای یک مشتری
- آیتمهای یک سفارش
- نقشهای یک کاربر
اما اگر سیستم OLTP سنگین دارید یا Queryهای پیچیده و پرتعداد اجرا میکنید، معمولاً استفاده از جدول نرمالشده گزینهٔ امنتری است.
Nested Table دارای متدهایی مثل COUNT، EXTEND، DELETE، EXISTS، FIRST، LAST، NEXT و TRIM است که مدیریت دادهها را در PL/SQL ممکن میکند.
این متدها اجازه میدهند:
- عناصر را اضافه یا حذف کنید
- بهصورت امن روی دادهها loop بزنید
- وجود یک اندیس خاص را بررسی کنید
بدون استفاده از این متدها، کار با Nested Table میتواند منجر به خطاهای منطقی یا performance شود.
بله، اما به شرط استفاده درست.
Nested Table برای دادههای وابسته و محدود بسیار مفید است و میتواند کد را خواناتر و طراحی دیتابیس را سادهتر کند.
با این حال، در سیستمهای پرترافیک یا زمانی که نیاز به گزارشگیری و Queryهای پیچیده دارید، ممکن است نگهداری و بهینهسازی آن دشوارتر از مدل نرمال باشد.
به همین دلیل، طراحی درست و شناخت سناریو بسیار مهم است.
جمعبندی
Nested Table در Oracle ابزار قدرتمندی برای مدلسازی دادههای چندمقداری است.
این قابلیت زمانی بیشترین ارزش را دارد که دادهها وابسته، محدود در کاربرد و معنایی لیستی داشته باشند.
اگر درست استفاده شود، Nested Table میتواند هم سادگی طراحی و هم خوانایی کد را بهشدت بالا ببرد.
📥 اگر سوالی داری در مورد Nested Table در اوراکل داری، در بخش کامنتها بپرس.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید