Table Values Constructor قابلیتی است که در بیشتر دیتابیسهای رابطه ای وجود داشته و اوراکل امکان استفاده از این قابلیت را در نسخه 23c فراهم کرده است.
بر اساس این قابلیت، می توانیم با اجرای یک دستور insert ساده(Insert به همراه عبارت Values) چندین رکورد را در یک جدول درج کنیم البته استفاده از کلمه کلیدی Values به دستور insert محدود نمی شود و از این عبارت می توانیم برای دستورات DMLای دیگر نظیر Select و Merge هم استفاده کنیم.
ابتدا مثالی از نحوه استفاده از این قابلیت را به همراه دستور insert مشاهده می کنید.
SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Tue Aug 29 22:41:17 2023
SQL> insert into Irani values(1,'Vahid'),(2,'Usef');
SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Tue Aug 29 22:41:17 2023
SQL> insert into Irani values(1,'Vahid'),(2,'Usef');
2 rows created.
SQL> commit;
Commit complete.
SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Tue Aug 29 22:41:17 2023
SQL> insert into Irani values(1,'Vahid'),(2,'Usef');
2 rows created.
SQL> commit;
Commit complete.
با اجرای دستور فوق دو رکورد در جدول Irani ثبت شده اند:
SQL> select * from Irani;
---------- --------------
SQL> select * from Irani;
ID NAME
---------- --------------
1 Vahid
2 Usef
SQL> select * from Irani;
ID NAME
---------- --------------
1 Vahid
2 Usef
این کار در نسخه های قبلی اوراکل امکان پذیر نبود:
SQL*Plus: Release 21.0.0.0.0 - Production on Tue Aug 29 21:47:30 2023
SQL> create table Irani(id number,name varchar2(14));
SQL> insert into Irani values(1,'Vahid'),(2,'Usef');
'ORA-00933: SQL command not properly ended'
SQL*Plus: Release 21.0.0.0.0 - Production on Tue Aug 29 21:47:30 2023
SQL> create table Irani(id number,name varchar2(14));
Table created.
SQL> insert into Irani values(1,'Vahid'),(2,'Usef');
'ORA-00933: SQL command not properly ended'
SQL*Plus: Release 21.0.0.0.0 - Production on Tue Aug 29 21:47:30 2023
SQL> create table Irani(id number,name varchar2(14));
Table created.
SQL> insert into Irani values(1,'Vahid'),(2,'Usef');
'ORA-00933: SQL command not properly ended'
و برای انجام این کار در نسخه 21c می بایست دو بار دستور insert را اجرا کنیم:
SQL*Plus: Release 21.0.0.0.0 - Production on Tue Aug 29 21:47:30 2023
SQL> insert into Irani values(1,'Vahid');
SQL> insert into Irani values(2,'Usef');
SQL*Plus: Release 21.0.0.0.0 - Production on Tue Aug 29 21:47:30 2023
ID NAME
---------- -----
1 Vahid
2 Usef
SQL> insert into Irani values(1,'Vahid');
1 row created.
SQL> insert into Irani values(2,'Usef');
1 row created.
SQL*Plus: Release 21.0.0.0.0 - Production on Tue Aug 29 21:47:30 2023
ID NAME
---------- -----
1 Vahid
2 Usef
SQL> insert into Irani values(1,'Vahid');
1 row created.
SQL> insert into Irani values(2,'Usef');
1 row created.
البته امکان اجرای دستورات فوق با استفاده از union all هم امکان پذیر است(در نسخه 21c):
select 1 as id,'Vahid' as name from dual
select 2 as id, 'Usef' as name from dual;
SQL> insert into Irani
select 1 as id,'Vahid' as name from dual
union all
select 2 as id, 'Usef' as name from dual;
2 rows created.
SQL> insert into Irani
select 1 as id,'Vahid' as name from dual
union all
select 2 as id, 'Usef' as name from dual;
2 rows created.
برای دستور select هم می توانیم به شکل زیر از قابلیت TVC استفاده کنیم:
SQL> select * from (values(1,'Vahid'),(2,'Usef'))tbl1(id,name);
SQL> select * from (values(1,'Vahid'),(2,'Usef'))tbl1(id,name);
ID NAME
---------- -----
1 Vahid
2 Usef
SQL> select * from (values(1,'Vahid'),(2,'Usef'))tbl1(id,name);
ID NAME
---------- -----
1 Vahid
2 Usef
این دستور در زمان ساخت جدول شاید کاربردی باشد:
SQL> create table Irani as select * from (values(1,'Vahid'),(2,'Usef'))tbl1(id,name);
SQL> select * from Irani;
------ -------- -----------
SQL> create table Irani as select * from (values(1,'Vahid'),(2,'Usef'))tbl1(id,name);
Table created.
SQL> select * from Irani;
ID NAME
---------- -----
1 Vahid
2 Usef
SQL> desc Irani
Name Null? Type
------ -------- -----------
ID NUMBER
NAME VARCHAR2(5)
SQL> create table Irani as select * from (values(1,'Vahid'),(2,'Usef'))tbl1(id,name);
Table created.
SQL> select * from Irani;
ID NAME
---------- -----
1 Vahid
2 Usef
SQL> desc Irani
Name Null? Type
------ -------- -----------
ID NUMBER
NAME VARCHAR2(5)
البته در دستور فوق می توانیم تنظیمات دیگری را هم اعمال کنیم برای مثال می توانیم حداکثر طول نوع داده VARCHAR2 و NUMBER را افزایش دهیم:
SQL> create table Irani as select * from (values(1,'Vahid'),(2,cast('USEF' as VARCHAR2(14))))tbl1(id,name);
------ -------- ---------------
SQL> create table Irani as select * from (values(1,'Vahid'),(2,cast('USEF' as VARCHAR2(14))))tbl1(id,name);
Table created.
SQL> desc Irani
Name Null? Type
------ -------- ---------------
ID NUMBER
NAME VARCHAR2(14)
SQL> create table Irani as select * from (values(1,'Vahid'),(2,cast('USEF' as VARCHAR2(14))))tbl1(id,name);
Table created.
SQL> desc Irani
Name Null? Type
------ -------- ---------------
ID NUMBER
NAME VARCHAR2(14)
این قابلیت همراه با with clause هم قابل استفاده است:
SQL> with Irani (ID,NAME) as (
values (1, 'Vahid'), (2, 'Usef'))
SQL> with Irani (ID,NAME) as (
values (1, 'Vahid'), (2, 'Usef'))
select * from Irani;
ID NAME
---------- -----
1 Vahid
2 Usef
SQL> with Irani (ID,NAME) as (
values (1, 'Vahid'), (2, 'Usef'))
select * from Irani;
ID NAME
---------- -----
1 Vahid
2 Usef
ارائه خدمات مشاوره ، پشتیبانی و نصب و راه اندازی پایگاه داده اوراکل در سراسر کشور......................
تلفن: 09128110897
ایمیل:vahidusefzadeh@gmail.com