ویژگی Private Temporary Table

با کمک این ویژگی از اوراکل 18c، جدول موقتی در سطح یک session یا transaction ایجاد می شود طوری که session دیگری امکان دسترسی به ان را ندارد همچنین با پایان یافتن session یا transaction، این جدول هم حذف خواهد شد.

فراداده(metadata) مربوط به این جداول معمولا در حافظه ذخیره می شوند(البته امکان ذخیره موقت ان در temporary tablespace هم وجود دارد).

این نوع از جداول باید با پیشوند مشخصی ایجاد شوند که این پیشوند از طریق پارامتر private_temp_table_prefix مشخص می شود:

SQL> show parameter private
NAME VALUE
————————————- ———————
private_temp_table_prefix ORA$PTT_

البته این پیشوند به شرط استفاده از عبارت ORA$ در ابتدای نام و همچنین منحصربفرد بودن ان در بین اسامی اشیاها، قابل تغییر می باشد:

SQL> alter system set private_temp_table_prefix=’ORA$usef_’ scope=spfile;
System altered.

این نوع از جداول در دو سطح session و transaction قابل تعریف می باشند که به طور پیش فرض(در صورت عدم اعمال نظر در این زمینه)، با پایان یافتن یک transaction، جدول هم حذف خواهد شد.

برای ایجاد جدول در سطح transaction، می توان از عبارت “ON COMMIT DROP DEFINITION” استفاده کرد و استفاده از عبارت “ON COMMIT PRESERVE DEFINITION” هم سبب خواهد شد تا این جدول تا پایان یافتن یک session باقی بماند:

ایجاد جدول در سطح transaction:

SQL> CREATE PRIVATE TEMPORARY TABLE ORA$usef_TBL1 (name varchar2(9),last_name varchar2(9)) ON COMMIT DROP DEFINITION;
Table created.

SQL> insert into ORA$usef_TBL1 values(‘VAHID’,’USEFZADEH’);
1 row created.

SQL> commit;
Commit complete.

SQL> select * from ORA$usef_TBL1;
ORA-00942: table or view does not exist

ایجاد جدول در سطح session:

SQL> CREATE PRIVATE TEMPORARY TABLE ORA$usef_TBL1 (name varchar2(9),last_name varchar2(9)) ON COMMIT PRESERVE DEFINITION;
Table created.

SQL> insert into ORA$usef_TBL1 values(‘VAHID’,’USEFZADEH’);
1 row created.

SQL> commit;
Commit complete.

SQL> select * from ORA$usef_TBL1;
NAME LAST_NAME
———- ———-
VAHID USEFZADEH

ضمن در نظر داشتن این مقدمات، جدول موقت یا private temp tableی را در session شماره یک ایجاد می کنیم:

[oracle@ol7 ~]$ sqlplus “usef/a@PDB”
SQL*Plus: Release 18.0.0.0.0 Production on Wed Apr 11 16:07:37 2018

SQL> CREATE PRIVATE TEMPORARY TABLE ORA$usef_TBL1 (name varchar2(9),last_name varchar2(9)) ON COMMIT PRESERVE DEFINITION;
Table created.

اطلاعاتی را به این جدول اضافه می کنیم:

SQL> insert into ORA$usef_TBL1 values(‘VAHID’,’USEFZADEH’);
1 row created.

SQL> commit;
Commit complete.

در همین حال، با session جدیدی به این pdb متصل شده و جدولی هم نام با جدول قبلی را در این یوزر ایجاد می کنیم:

select username,sid,serial# from v$session where sid in(SELECT sid FROM v$mystat WHERE ROWNUM = 1);
USERNAME SID SERIAL#
——————— ———— ————
USEF 287 1657

SQL> CREATE PRIVATE TEMPORARY TABLE ORA$usef_TBL1 as select * from v$datafile;
Table created.

همانطور که قابل مشاهده است، دو جدول با یک نام مشترک توسط کاربر usef ایجاد شده است که هر کدام در سطح session قابل دسترسی هستند.

با توجه به اینکه فراداده مربوط به این نوع از جداول در حافظه ذخیره می شود، پس امکان ایجاد انها در حالت read only هم ممکن می باشد:

SQL> select OPEN_MODE,DATABASE_ROLE from v$database;

OPEN_MODE DATABASE_ROLE
——————— ——————
READ ONLY PHYSICAL STANDBY

SQL> CREATE PRIVATE TEMPORARY TABLE ORA$usef_TBL1 (name varchar2(9),last_name varchar2(9));
Table created.

پ.ن 1: برای مشاهده مشخصات این نوع از جدوال در session جاری، می توان از ویوی USER_PRIVATE_TEMP_TABLES استفاده کرد:

SQL> select SID,SERIAL#,TABLE_NAME from USER_PRIVATE_TEMP_TABLES;
SID SERIAL# TABLE_NAME
———— ———— ———————
377 10668 ORA$USEF_TBL1

پ.ن 2: برای مشاهده همه PTTها هم می توان از ویوی DBA_PRIVATE_TEMP_TABLES کمک گرفت.

پ.ن 3: این نوع از جداول بسیاری از قابلیتهای جداول پایدار، نظیر ایجاد ایندکس، پارتیشن بندی، جمع اوری آمار و … را پشتیبانی نمی کنند.

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