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

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

Collection در Oracle (PL/SQL) چیست؟

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

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

  • کاملاً مفهومی بفهمی
  • کاربردی و پروژه‌محور یاد بگیری
  • با مثال‌هایی که واقعاً در پروژه استفاده می‌شوند

برای نوشتن Dynamic SQL امن و بهینه در Oracle باید از EXECUTE IMMEDIATE یا DBMS_SQL به‌درستی استفاده کنید، ورودی‌ها را اعتبارسنجی کنید، از Bind Variable بهره ببرید، و اجرای کد را با Exception Handling امن نگه دارید. پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.

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

Collection در Oracle چیست؟

به زبان ساده:

Collection یعنی یک متغیر که می‌تواند چند مقدار هم‌نوع را به‌صورت گروهی در حافظه نگه دارد.

یعنی به‌جای این که ده‌ها متغیر جداگانه داشته باشی، همه داده‌ها را داخل یک Collection می‌ریزی و خیلی تمیز و سریع با آن‌ها کار می‌کنی.

مقایسه ذهنی:

  • Java → List / Array
  • Python → list
  • Oracle PL/SQL → Collection

انواع Collection در Oracle

Oracle سه نوع Collection دارد:

  1. Associative Array (Index‑By Table)
  2. Nested Table
  3. VARRAY

هرکدام را جداگانه، با مثال درست بررسی می‌کنیم.

Associative Array در Oracle

				
					DECLARE
  TYPE t_email IS TABLE OF VARCHAR2(100) INDEX BY VARCHAR2(50);
  v_email t_email;
BEGIN
  v_email('Ali')  := 'ali@test.com';
  v_email('Sara') := 'sara@test.com';

  DBMS_OUTPUT.PUT_LINE(v_email('Sara'));
END;

				
			

📌 این دقیقاً مثل Dictionary است.

پیمایش و خواندن در Associative Array

				
					DECLARE
  TYPE t_data IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
  v_data t_data;
  i PLS_INTEGER;
BEGIN
  v_data(100) := 10;
  v_data(200) := 20;

  i := v_data.FIRST;
  WHILE i IS NOT NULL LOOP
    DBMS_OUTPUT.PUT_LINE('Index='||i||' Value='||v_data(i));
    i := v_data.NEXT(i);
  END LOOP;
END;

				
			

چه زمانی از Associative Array استفاده کنیم؟

✅ پردازش سریع

✅ Key‑Value

✅ فقط PL/SQL

❌ قابل ذخیره در جدول نیست

Nested Table در Oracle

Nested Table یک Collection خیلی مهم است چون هم در PL/SQL و هم در SQL قابل استفاده است.

تعریف نوع Nested Table

				
					CREATE TYPE t_number_tab AS TABLE OF NUMBER;

				
			

استفاده در PL/SQL

				
					DECLARE
  v_numbers t_number_tab := t_number_tab(10,20,30);
BEGIN
  DBMS_OUTPUT.PUT_LINE(v_numbers(1));
END;

				
			

متدهای مهم Nested Table

  • COUNT → تعداد عناصر
  • EXTEND → اضافه کردن عنصر جدید
  • DELETE → حذف عنصر
  • FIRST / LAST → اولین و آخرین Index
  • EXISTS → بررسی وجود Index

مثال : اضافه کردن و حذف داده در Nested Table

				
					DECLARE
  v_numbers t_number_tab := t_number_tab();
BEGIN
  v_numbers.EXTEND(2);
  v_numbers(1) := 100;
  v_numbers(2) := 200;

  v_numbers.DELETE(1);

  DBMS_OUTPUT.PUT_LINE(v_numbers.COUNT);
END;

				
			

استفاده از Nested Table در جدول دیتابیس

				
					CREATE TABLE orders (
  order_id NUMBER,
  product_ids t_number_tab
)
NESTED TABLE product_ids STORE AS product_ids_nt;

				
			

📌 مناسب برای مدل‌سازی داده‌های یک به چند بدون جدول واسط سنگین.

VARRAY در Oracle

VARRAY یعنی Collection با حداکثر اندازه مشخص

تعریف VARRAY

				
					CREATE TYPE t_scores AS VARRAY(5) OF NUMBER;

				
			

استفاده VARRAY

				
					DECLARE
  v_scores t_scores := t_scores(15,18,20);
BEGIN
  DBMS_OUTPUT.PUT_LINE(v_scores(3));
END;

				
			

محدودیت VARRAY

اگر بیشتر از ۵ آیتم اضافه شود:

				
					ORA-22165: given index is out of range

				
			

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

✅ لیست کوتاه

✅ داده‌های ثابت

❌ داده زیاد یا داینامیک

مقایسه سریع Collectionها

  • Associative Array → فقط PL/SQL، سریع
  • Nested Table → SQL + PL/SQL، بدون محدودیت
  • VARRAY → SQL + PL/SQL، اندازه محدود

Collection و Performance

BULK COLLECT

				
					DECLARE
  TYPE t_emp IS TABLE OF employees%ROWTYPE;
  v_emp t_emp;
BEGIN
  SELECT *
  BULK COLLECT INTO v_emp
  FROM employees;

  FOR i IN 1 .. v_emp.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE(v_emp(i).employee_id);
  END LOOP;
END;

				
			

✅ کاهش Context Switch

✅ افزایش شدید سرعت

FORALL

				
					DECLARE
  TYPE t_ids IS TABLE OF NUMBER;
  v_ids t_ids := t_ids(1,3,5);
BEGIN
  FORALL i IN 1 .. v_ids.COUNT
    DELETE FROM employees
    WHERE employee_id = v_ids(i);
END;

				
			

📌 این دقیقاً چیزی است که در پروژه‌های واقعی استفاده می‌شود.

نکات طلایی از تجربه پروژه‌ های انجام شده

  • فقط PL/SQLAssociative Array
  • نیاز به SQLNested Table
  • حجم کم → VARRAY
  • Performance مهم → BULK COLLECT + FORALL

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

Collection در Oracle یک ساختار داده‌ای در PL/SQL است که امکان ذخیره چند مقدار هم‌نوع را به‌صورت گروهی فراهم می‌کند.

برخلاف Arrayهای ساده، Collection‌ها قابلیت‌هایی مثل افزایش یا کاهش اندازه در زمان اجرا، استفاده در SQL (در Nested Table و VARRAY) و پردازش سریع داده‌ها در حافظه را دارند.

همین ویژگی‌ها باعث شده Collection به یک ابزار کلیدی برای نوشتن کدهای حرفه‌ای و بهینه در Oracle تبدیل شود.

در Oracle سه نوع Collection وجود دارد که هرکدام کاربرد خاص خودشان را دارند:

  • Associative Array فقط در PL/SQL استفاده می‌شود، بسیار سریع است و برای پردازش‌های حافظه‌ای مناسب است.
  • Nested Table هم در PL/SQL و هم در SQL قابل استفاده است و می‌تواند در جدول دیتابیس ذخیره شود.
  • VARRAY اندازه مشخص دارد و برای لیست‌های کوچک و ثابت مناسب است.

انتخاب نوع Collection تأثیر مستقیمی روی خوانایی کد، عملکرد و طراحی دیتابیس دارد.

زمانی که قرار است حجم زیادی از داده‌ها را پردازش کنید، استفاده از BULK COLLECT و FORALL ضروری می‌شود.

BULK COLLECT داده‌ها را یک‌جا داخل Collection می‌ریزد و FORALL عملیات DML را به‌صورت دسته‌ای اجرا می‌کند.

این کار باعث کاهش شدید Context Switch بین SQL و PL/SQL شده و Performance را چند برابر بهتر می‌کند؛ به‌خصوص در پروژه‌های Enterprise.

اگر تمرکز اصلی روی Performance باشد، معمولاً Associative Array بهترین انتخاب است، چون کاملاً حافظه‌ای است و سربار SQL ندارد.

اما اگر نیاز به استفاده در SQL یا ذخیره در دیتابیس داشته باشید، Nested Table همراه با BULK COLLECT و FORALL بهترین ترکیب برای رسیدن به عملکرد بالا و طراحی اصولی محسوب می‌شود.

جمع‌بندی

اگر Collection را درست یاد بگیری، نصف راه حرفه‌ای شدن در PL/SQL را رفته‌ای.

کدی که بدون Collection نوشته شود:

  • کندتر است
  • سخت‌تر نگه‌داری می‌شود
  • مقیاس‌پذیر نیست

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

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

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

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

میثم راد

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

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

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