اگر با پایگاهداده اوراکل آشنایی داشته باشید، حتماً دستور سادهی INSERT INTO را میشناسید. اجازه دهید بهطور خلاصه شکل سنتی استفاده از این دستور را با چند مثال ساده یادآوری کنم:
SQL> CREATE TABLE vahid.tbl ( id NUMBER, name VARCHAR2(100), last_name VARCHAR2(100) ); Table created. SQL> INSERT INTO vahid.tbl VALUES (1, 'VAHID', 'YOUSEFZADEH'); 1 row created. SQL> INSERT INTO vahid.tbl (name, last_name) VALUES ('VAHID', 'YOUSEFZADEH'); 1 row created.
وقتی با جدولهایی کار میکنیم که ستونهای زیادی دارند، این syntax(نحو) میتواند خواندن کد را سخت کند، چرا که همیشه واضح نیست هر مقدار به کدام ستون تعلق دارد.
اوراکل 23ai (23.9) سینتکس(نحو) جدیدی را معرفی کرده که دستور INSERT INTO را خواناتر میکند. این کار با استفاده از عبارت SET(شبیه آنچه در دستور UPDATE استفاده میشود)، قابل اجراست. مثال زیر را ببینید.
SQL> INSERT INTO vahid.tbl SET id = 1, name = 'VAHID', last_name = 'YOUSEFZADEH'; 1 row created.
همانطور که میبینید، این syntax(نحو) نیازی به پرانتز برای جفت ستون-مقدار ندارد و خوانایی را افزایش میدهد.
با این حال، این نحو جدید در حال حاضر از درج چند ردیف بدون پرانتز پشتیبانی نمیکند. برای درج چند ردیف همچنان باید از پرانتز استفاده شود:
SQL> INSERT INTO vahid.tbl SET (id = 1, name = 'VAHID', last_name = 'YOUSEFZADEH'), (id = 2, name = 'Bahman', last_name = 'Garosi'); 2 rows created.
INSERT INTO BY NAME برای درج از زیرپرسوجو (Subquery)
دیگر قابلیت ارزشمند در این زمینه مربوط به درج از طریق Subquery است. در حالت سنتی، هنگام درج ردیفها از یک زیرپرسوجو، ترتیب ستونها در دستور SELECT باید دقیقاً با ترتیب ستونهای جدول مقصد یکسان باشد. این میتواند وقتگیر و مستعد خطا باشد.
با عبارت BY NAME، اوراکل ستونها را بر اساس نام یا alias تطبیق میدهد نه بر اساس موقعیت. این انعطاف باعث میشود که ستونها در هر ترتیبی قرار بگیرند.
مثال اول:
SQL> CREATE TABLE vahid.tbl ( id NUMBER, name VARCHAR2(100), last_name VARCHAR2(100) ); Table created. SQL> CREATE TABLE vahid.tbl2 ( id NUMBER, last_name VARCHAR2(100), name VARCHAR2(100) ); Table created. SQL> desc vahid.tbl; Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER NAME VARCHAR2(100) LAST_NAME VARCHAR2(100) SQL> desc vahid.tbl2; Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER LAST_NAME VARCHAR2(100) NAME VARCHAR2(100) SQL> INSERT INTO vahid.tbl SET id = 1, name = 'VAHID', last_name = 'YOUSEFZADEH'; 1 row created. SQL> INSERT INTO vahid.tbl2 BY NAME SELECT id, name, last_name FROM vahid.tbl; 1 row created. SQL> SELECT * FROM vahid.tbl; ID NAME LAST_NAME ---------- ---------- ----------- 1 VAHID YOUSEFZADEH SQL> SELECT * FROM vahid.tbl2; ID LAST_NAME NAME ---------- ----------- ---------- 1 YOUSEFZADEH VAHID
مثال دوم:
SQL> INSERT INTO vahid.tbl SET id = 1, name = 'VAHID', last_name = 'YOUSEFZADEH'; 1 row created. SQL> insert into vahid.tbl2(id,name,last_name) BY NAME SELECT name,id, last_name FROM vahid.tbl; 1 row created. SQL> SELECT id,name,last_name FROM vahid.tbl; ID NAME LAST_NAME ---------- ---------- ----------- 1 VAHID YOUSEFZADEH SQL> SELECT id,name,last_name FROM vahid.tbl2; ID NAME LAST_NAME ---------- ---------- ----------- 1 VAHID YOUSEFZADEH
مثال سوم:
SQL> drop table vahid.tbl; Table dropped. SQL> drop table vahid.tbl2; Table dropped. SQL> CREATE TABLE vahid.tbl ( id2 NUMBER, name VARCHAR2(100), last_name VARCHAR2(100) ); Table created. SQL> CREATE TABLE vahid.tbl2 ( id NUMBER, last_name VARCHAR2(100), name VARCHAR2(100) ); Table created. SQL> INSERT INTO vahid.tbl SET id2 = 1, name = 'VAHID', last_name = 'YOUSEFZADEH'; 1 row created. SQL> INSERT INTO vahid.tbl2(id,name,last_name) BY NAME SELECT id2, name, last_name FROM vahid.tbl; ERROR at line 1: ORA-63877: The explicit column list does not exactly match the exposed column names. Help: https://docs.oracle.com/error-help/db/ora-63877/