اوراکل 23ai(23.9) – دستور INSERT INTO SET و INSERT INTO BY NAME

اگر با پایگاه‌داده اوراکل آشنایی داشته باشید، حتماً دستور ساده‌ی 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/

 

ارائه خدمات مشاوره ، پشتیبانی و نصب و راه اندازی پایگاه داده اوراکل در سراسر کشور...................... تلفن: 09128110897 ایمیل:vahidusefzadeh@gmail.com

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

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