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'); 2 rows created. SQL> commit; Commit complete.
با اجرای دستور فوق دو رکورد در جدول Irani ثبت شده اند:
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)); 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 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):
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); ID NAME ---------- ----- 1 Vahid 2 Usef
این دستور در زمان ساخت جدول شاید کاربردی باشد:
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); 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')) select * from Irani; ID NAME ---------- ----- 1 Vahid 2 Usef