
در بانکهای اطلاعاتی Oracle Database، دستور INSERT معمولاً برای اضافه کردن یک رکورد استفاده میشود.
اما در خیلی از پروژهها نیاز داریم چند ردیف را با یک دستور واحد وارد کنیم تا هم کد کوتاهتر و خواناتر شود، هم سرعت اجرای عملیات بالاتر برود.
در نسخه جدید Oracle 23ai این امکان به صورت پیشرفتهتری با سینتکس مشابه MySQL و PostgreSQL فراهم شده است.
در این مقاله آموزش اوراکل در بخش آموزش Oracle SQL به صورت جامع تمام روشهای Multi‑Row Insert را از پایه تا پیشرفته بررسی میکند.
در اوراکل، سیستمهای دیتابیس پرتراکنش، تراکنشهای ناموفق یا Failed Transactions یکی از عوامل اصلی کاهش عملکرد و نارضایتی کاربران هستند.
پیشنهاد می کنم برای این که دیگه به خطاهای Dead lock در اوراکل نخوری مقاله زیر رو ببینی.
در این مقاله شما می خوانید
روشهای وارد کردن چند رکورد در اوراکل
۱. Multi‑Values Syntax در Oracle 23ai
نسخههای قدیمی Oracle چنین قابلیتی نداشتند، اما از ۲۳ai به بعد میتوانید چند ردیف را با ساختار سادهی VALUES وارد کنید:
INSERT INTO employees (employee_id, first_name, last_name, salary)
VALUES
(۳۰۴, 'Hamid', 'Moradi', 4100),
(۳۰۵, 'Zahra', 'Najafi', 4300),
(۳۰۶, 'Mehdi', 'Bahrami', 3900);
مزایا:
- کد ساده و قابل فهم.
- مناسب برای وارد کردن دادههای اولیه (Seed Data).
- کاهش تعداد Parse در SQL Engine.
۲. INSERT ALL — روش قدیمی و قدرتمند
این روش از نسخه ۹i موجود است و در قالب دستور زیر استفاده میشود:
INSERT ALL
INTO employees (employee_id, first_name, last_name, salary)
VALUES (301, 'Ali', 'Hosseini', 4200)
INTO employees (employee_id, first_name, last_name, salary)
VALUES (302, 'Sara', 'Ahmadi', 3900)
INTO employees (employee_id, first_name, last_name, salary)
VALUES (303, 'Reza', 'Mansouri', 4500)
SELECT * FROM dual;
ویژگی مهم:
با INSERT ALL میتوانید رکوردها را در جداول مختلف یا یک جدول واحد وارد کنید و حتی شرط بگذارید.
۳. INSERT FIRST — درج شرطی
برای وارد کردن دادهها بر اساس اولین شرط درست از INSERT FIRST استفاده میشود:
INSERT FIRST
WHEN salary < 4000 THEN
INTO low_salary_emps (emp_id, name) VALUES (employee_id, first_name)
WHEN salary >= ۴۰۰۰ THEN
INTO high_salary_emps (emp_id, name) VALUES (employee_id, first_name)
SELECT employee_id, first_name, salary
FROM employees_source;
۴. INSERT SELECT — درج چند رکورد از نتایج یک Query
در این روش دادهها از یک یا چند جدول خوانده و وارد جدول مقصد میشوند:
INSERT INTO employees_archive (employee_id, first_name, last_name, salary)
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary > ۴۰۰۰;
نکات عملکردی (Performance) در Multi‑Row Insert
- کاهش تعداد Commit: عملیات بزرگ را دستهبندی کنید.
- Bind Variables: برای کاهش مصرف حافظه و افزایش سرعت Parsing.
- Direct Path Insert با
APPEND hintبرای افزایش سرعت Bulk Insert:
INSERT /*+ APPEND */ INTO big_table SELECT ...;
اشتباهات رایج در Multi‑Row Insert
- استفاده از Multi‑Values Syntax در نسخههای قبل از ۲۳ai باعث خطای syntax میشود.
- در
INSERT ALLفراموش کردنSELECT * FROM dualرایج است. - عدم تطابق ترتیب ستونها با دادهها منجر به خطا خواهد شد.
- وارد کردن کلیدهای تکراری باعث توقف کل عملیات میشود.
مثال: آمادهسازی دادههای اولیه برای Multi-Row Insert
INSERT INTO users (id, username, password, role)
VALUES
(۱, 'admin', 'hashedpass1', 'ADMIN'),
(۲, 'staff', 'hashedpass2', 'STAFF'),
(۳, 'guest', 'hashedpass3', 'GUEST');
این روش در Oracle 23ai بدون مشکل اجرا میشود.
سوالات متداول درباره پکیج Multi‑Row Insert در اوراکل
در Oracle 23ai میتوانید از سینتکس جدید Multi‑Values استفاده کنید:
INSERT INTO employees (id, name, salary)
VALUES
(۱, ‘Ali’, 4200),
(۲, ‘Sara’, 3900),
(۳, ‘Reza’, 4500);
این سینتکس مشابه MySQL و PostgreSQL است و برای افزودن چند رکورد به صورت یکجا بسیار سریع و ساده عمل میکند.
در نسخههای قدیمیتر باید از INSERT ALL استفاده میکردید.
- INSERT ALL: از نسخه ۹i موجود بوده و نیاز به یک
SELECTدارد (معمولاً از جدولdual). قابلیت درج دادهها در چند جدول یا اضافه کردن شرطهای مختلف را دارد. - Multi‑Values Syntax: در Oracle 23ai معرفی شده، سادهتر است و بدون SELECT کار میکند، اما فقط در یک جدول دادهها را وارد میکند و برای Conditional Insert باید سراغ
INSERT FIRSTبروید.
بله. اجرای چند رکورد در یک دستور باعث کاهش تعداد Round Trip بین اپلیکیشن و دیتابیس، و همچنین کاهش Parse های اضافی در SQL Engine میشود.
برای حجم بسیار زیاد دادهها، استفاده از Direct Path Insert با راهنمای APPEND حتی سریعتر است، ولی باید با مدیریت Commitها مراقب مصرف منابع باشید.
این خطا معمولاً زمانی رخ میدهد که:
- از Multi‑Values Syntax در نسخههای قبل از Oracle ۲۳ai استفاده کنید (در نسخههای قبلی پشتیبانی نمیشود).
- ترتیب ستونها در دستور
INSERTبا مقادیر دادهها مطابقت نداشته باشد. - برای هر رکورد، تعداد مقادیر با تعداد ستونها برابر نباشد.
برای حل مشکل، یا به نسخه ۲۳ai ارتقا بدهید، یا از روش سنتی INSERT ALL استفاده کنید.
جمعبندی
با امکانات جدید Oracle 23ai، اجرای Multi‑Row Insert بسیار سادهتر و شبیه سایر پایگاههای داده محبوب شده است.
با انتخاب روش مناسب (INSERT ALL، INSERT FIRST، Multi‑Values یا INSERT SELECT) میتوانید درج چند رکورد را با سرعت و دقت بالا انجام دهید.
📥 اگر سوالی داری در مورد Multi‑Row Insert در اوراکل داری، در بخش کامنتها بپرس.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید