VIEW یکی از OBJECT های دیتابیس اوراکل است که در این متن روش ساخت و استفاده از آن را توضیح می دهیم.
VIEW چیست؟
هر VIEW یک دستور SELECT ذخیره شده در دیتابیس است که اطلاعات یک یا چند جدول را جهت نمایش یا ویرایش در کنار هم قرار می دهد. برای مثال می توان بخشی از اطلاعات دو جدول را با یک دستور SELECT، باهم JOIN کرد و این دستور را در قالب یک VIEW ذخیره کرد. بنابراین یک کاربر دیتابیس با SELECT کردن این VIEW در واقع یک دستور JOIN دو جدول را اجرا خواهد کرد بدون اینکه از نام اصلی جدول ها، ستون ها و روش استفاده از دستور JOIN مطلع باشد.
بعد از اینکه یک VIEW ساخته شد می توانیم در محدوده اطلاعات آن VIEW از دستورات SELECT یا DML استفاده کنیم. برای هر VIEW (بر خلاف MATERILIZED VIEW) فقط دستور SELECT داخلی آن در دیتادیکشنری ذخیره می شود و احتیاج به هیچ فضای ذخیره سازی دیگری ندارد. به جدول یا جدول هایی که در دستور داخلی VIEW استفاده شده اند BASE TABLE می گویند.
نکته: وقتی یک VIEW را برای نمایش یا ویرایش انتخاب می کنیم مراحل زیر اتجام می شود:
1.دستور داخلی آن VIEW از جدول دیتادیکشنری استخراج می شود.
2.مجوزهای لازم بررسی می شوند.
3.عملیات دستور داخلی VIEW برای دستیابی به اطلاعات جدول ها انجام می شود.
مزایای استفاده از VIEW
–محدود سازی دسترسی به داده ها و جدول ها: نام اصلی جداول و ستون ها را مخفی می کنیم.
–آسان نمودن استفاده از QUERY های سنگین: برای مثال یک QUERY طولانی و پیچیده برای نمایش فضای استفاده شده از TABLESPACEهای دیتابیس داریم که آن را در قالب یک VIEW ذخیره می کنیم و هربار با یک SELECT ساده از آن VIEW آن QUERY اجرا خواهد شد.
–ایجاد نمایش های مختلف برای مجموعه ای از داده ها
–مناسب برای استفاده در APPLICATION ها
انواع VIEW
VIEWها به دو دسته تقسیم بندی می شوند:
1.SIMPLE VIEW
—اطلاعات از یک جدول بدست می آید
—در دستور SELECT داخلی از توابع یا گروه بندی اطلاعات استفاده نمی شود.
—معمولا بعد از ایجاد VIEW علاوه بر SELECT از عملیات DML در محدوده اطلاعات آن VIEW استفاده می شود.
2.COMPLEX VIEW
–اطلاعات VIEW معمولا از چند جدول استخراج می شود.
–در دستور داخلی VIEW از توابع یا روش های گروه بندی اطلاعات استفاده می شود.
–معمولا از عملیات DML برای این دسته از VIEWها استفاده نمی شود.
روش ساخت VIEW
سینتکس ساخت یک VIEW را در شکل زیر می بینید. هر قسمت از این سینتکس را در ادامه توضیح می دهیم.
-عبارت OR REPLACE: زمانی که یک VIEW با یک نام خاص ایجاد شده است می توان با این عبارت دستور داخلی آن VIEW را تغییر داد و ذخیره کرد. بنابراین اگر می خواهیم یک VIEW را تغییر دهیم نیاز نیست آن را DROP کنیم، مجددا تعریف کنیم و دوباره مجوزهای لازم را به آن بدهیم.
–FORCE: حتی اگر جدول های مورد استفاده در دستور داخلی وجود ندارد آن VIEW تعریف خواهد شد
-NO FORCE: در حالت پیش فرض این مورد استفاده می شود. یعنی اگر جدولی که در دیتابیس وجود ندارد در دستور داخلی استفاده شده باشد آن VIEW ایجاد نخواهد شد
-ALIAS: می توان لیست ALIAS های مورد استفاده شده در دستور داخلی را در این قسمت تعریف کرد. البته تعداد و ترتیب این ALIAS ها باید برابر با تعداد و ترتیب ستون ها و عبارت استفاده شده در دستور داخلی باشد.
-SUBQUERY: همان دستور SELECT داخلی VIEW است.
-WITH CHECK OPTION: یک نوع CONSTRAINT است که تضمین می کند عملیات DML فقط برای سطرهایی که در حوزه دسترسی آن VIEW قرار دارد امکان پذیر است. اگر هیچ نامی برای این CONSTRAINT انتخاب نشود از نام های پیش فرض دیتابیس SYS_Cn)) استفاده می شود.
-WITH READ ONLY: اگر از این عبارت استفاده شود نمی توان هیچگونه عملیات DML آن VIEW را اجرا کرد. یعنی فقط می توان آن VIEW را SELECT کرد.
مثال: یک VIEW ایجاد کنید که شماره پرسنلی، نام و حقوق تمام پرسنل دپارتمان 80 را انتخاب کند. سپس ساختار آن VIEW را نمایش دهید.
مثال: یک دستور بنویسید که شماره پرسنلی، نام و حقوق تمام پرسنل دپارتمان 80 را نمایش دهد.
SELECT * FROM empvu80;
نکته: همانند یک جدول می توان فقط بخشی از اطلاعات که در محدوده اطلاعات یک VIEW قرار دارد را انتخاب کرد.
مثال: یک دستور بنویسید که شماره پرسنلی، نام و حقوق پرسنلی که در دپارتمان 80 حقوق بالای 4000 می گیرند را نمایش دهد.
SELECT * FROM empvu80 where salary > 4000;
مثال: یک VIEW تعریف کنید که حقوق سالیانه نام و شماره پرسنلی کارمندان دپارتمان شماره 50 را انتخاب کند.
مثال: VIEW مثال قبل را تغییر دهید به نحوی که ALIASها در لیست دستور ساخت قرار داشته باشند.
CREATE OR REPLACE VIEW salvu50 (ID_NUMBER, NAME, ANN_SALARY)
AS SELECT employee_id, last_name, salary*12 FROM employees
WHERE department_id = 50;
مثال: یک VIEW به نام EMPVU80 ایجاد کنید. برای چهار ستون دستور داخلی ALIAS تعریف کنید.
نکته: اگر در دستور داخلی یک VIEW برای یک ستون از یک تابع یا یک EXPRESSION استفاده شود باید یک نام مستعار برای آن ستون استفاده شود وگرنه در زمان ساخت VIEW خطای اوراکل دریافت می کنیم.
مثال: ایجاد یک VIEW COMPLEX که در آن از توابع و عمل JOIN استفاده شده است.
نمایش اطلاعات VIEWها در دیتابیس اوراکل
برای نمایش اطلاعات VIEWهای موجود در دیتابیس می توان از دیتادیکشنری DBA_VIEWS یا USER_VIEWS استفاده کرد. برای یک VIEW دستور داخلی آن در ستون TEXT ذخیره می شود و ستون TEXT_LENGTH تعداد کاراکترهای آن دستور را نشان می دهد.
تغییر داده های یک VIEW با عملیات DML
همانطور که گفته شد برای یک VIEW می توان علاوه بر دستور SELECT از دستورات DML نیز استفاده کرد.
نکته: نمی توان یک سطر از یک VIEW را حذف کرد (DELETE) اگر در دستور داخلی VIEW
1.یک عبارت GROUP BY استفاده شده باشد.
2.از کلمه کلیدی DISTINCT استفاده شده باشد.
3.از تابع گروهی استفاده شود.
4.از کلمه کلیدی ROWNUM (شبه ستون ROWNUM) استفاده شود.
نکته: نمی توان داده های یک VIEW را تغییر داد (UPDATE) اگر در دستور داخلی VIEW
1.یک عبارت GROUP BY استفاده شده باشد.
2.از کلمه کلیدی DISTINCT استفاده شده باشد.
3.از تابع گروهی استفاده شود.
4.از کلمه کلیدی ROWNUM (شبه ستون ROWNUM) استفاده شود.
5.از یک EXPRESSION برای یک ستون استفاده شده باشد
نکته: نمی توان به جدول های یک VIEW سطر جدید اضافه کرد (INSERT) اگر در دستور داخلی VIEW
1.یک عبارت GROUP BY استفاده شده باشد.
2.از کلمه کلیدی DISTINCT استفاده شده باشد.
3.از تابع گروهی استفاده شود.
4.از کلمه کلیدی ROWNUM (شبه ستون ROWNUM) استفاده شود.
5.از یک EXPRESSION برای یک ستون استفاده شده باشد
6.ستون هایی در جدول BASE TABLE داشته باشیم که دارای CONSTRAINT از نوع NOT NULL باشند ولی در دستور داخلی VIEW استفاده نشده اند. در ضمن این ستون ها مقدار DEFAULT ندارند.
مثال: ابتدا یک جدول با دو ستون می سازیم. سپس VIEW را با ستونی که از نوع NOT NULL نیست می سازیم
create table test(name varchar2(10),pers_id integer not null)
create or replace view test_m as select name from test;
برای VIEW از دستور INSERT استفاده می کنیم.
insert into test_m values(‘milad’)
خطای اوراکل دریافت می کنیم.
برای ستون جدول که NOT NULL است یک مقدار DEFAULT تعریف می کنیم.
alter table test modify (pers_id integer default 1)
دستور INSERT را دوباره اجرا می کنیم. مقدار مورد نظر در جدول اصلی درج شده است.
insert into test_m values(‘milad’)
select * from test_m;
milad
نکته: اگر در زمان ساخت یک VIEW از عبارت WITH CHECK OPTION استفاده شود تضمین می شود که فقط در حوزه اطلاعات آن VIEW دستورات DML اجرا خواهد شد. یعنی دستورات INSERT و UPDATE فقط روی سطرهایی که آن VIEW می تواند انتخاب کند انجام می شود و هر سطری که توسط دستور داخلی SELECT انتخاب شود را می توان اضافه کرد ولی نمی توان حذف کرد.
مثال: فقط سطر جدیدی که شماره دپارتمان آن برابر با 20 است به VIEW اضافه خواهد شد و هیچ مقدار در ستون شماره دپارتمان تغییر نخواهد کرد. چون اگر 20 ها تغییر کنند دیگر توسط VIEW انتخاب نمی شوند و غیر 20 ها هم در حوزه آن VIEW نیستند.
مثال: در VIEW مثال قبل کارمند با شماره پرسنلی 201 در دپارتمان 20 مشغول به کار است بنابراین نمی توان مقدار شماره دپارتمان آن را تغییر داد.
نکته: اگر در تعریف یک VIEW از عبارت WITH READ ONLY استفااده شود نمی توان هیچگونه عملیات DML روی آن VIEW انجام داد.
مثال: یک VIIEW تعریف کنید که عملیات DML را نپذیرد. یک عمل DML انجام دهید.
نکته: اگر یک VIEW حذف(DROP) شود جدول های آن VIEW حذف نمی شوند. اگر هر کدام از BASE TABLEها حذف شوند یا یک ستون که در VIEW استفاده شده است حذف گردد آن VIEW به صورت INVALID می شود و در زمان اجرا خطای اوراکل HAS ERRORS دریافت می کنیم.
مثال: ابتدا جدول را ایجاد کرده و یک VIEW از یکی از ستون های آن ایجاد می کنیم.
create table milad.mytable(name varchar2(10),pers_id integer);
create or replace view milad.tbl_m as select pers_id from milad.mytable;
ستونی که از روی آن VIEW ساختیم را حذف می کنیم.
alter table milad.mytable drop(pers_id);
آن VIEW انتخاب می کنیم و خطای HAS ERRORS دیافت می کنیم.
select * from milad.tbl_m;
ممنون از شما