Üye Kayıt Üye Giriş

Oracle View Yaratmak ve Değiştirmek / Performans


Oracle View Yaratmak ve Değiştirmek / Performans

 

 

Öncelikle bir view (bundan böyle görüntü olarak adlandıralım) tanımını yapmakla başlayalım. Bir görüntü, tablo veya başka bir görüntüdeki verinin yeniden gösterilmesi ve düzenlenmesi anlamına gelen objedir. Bir görüntünün referans olduğu objenin adı ise baz tablodur. Görüntülerle ilgili bilinmesi gereken belki de en önemli nokta; görüntüler veri tutmamaktadır. Yalnız içeriğine ait olan sorgunun data dictionary’de tutulmasıdır. Görüntüler, ana objelere refere olan bir işaretleyicidir. Herhangi bir boyutu bulunmamaktadır çünkü içerisinde veri tutmuyordur. Hazır yeri gelmişken, içerisinde veri barındırabilen ve sürekli olarak güncellenebilen görüntü türüne “materialized view” denmektedir. Görüntüler ayrıca bir veri görüntülenebilirliği koruması olarakta kullanabilirsiniz. Örnek; tabloda 10 tane sütun olduğunu düşünün. Bunlardan 2 tanesini tanımlayacağınız gruptaki insanların görmesini istemiyorsunuz. Yapmanız gereken bir görüntü hazırlamak ve kalan 8 sütunu bu görüntünün içeriği olarak işaretlemek.

Oracle komutları arasından “CREATE VIEW” komutu istenilen görüntünün oluşturulmasını sağlar. Yaratılacak olan bu görüntü birden fazla objeye refere ediyor olabilir. Bir örnekle devam edelim;

01 SQL> create table yonetim
02 2 (
03 3 isim varchar2(30) notnull,
04 4 soyisim varchar2(60) notnull,
05 5 kullanici_kodu number(5) not null
06 6 );
07  
08 Table created.
09  
10 SQL> CREATE VIEWogan_deneme AS
11 2 SELECT isim, soyisim, kullanici_kodu
12 3 FROM yonetim
13 4 WHEREkullanici_kodu IN (100,200,300);
14  
15 View created.
16  
17 SQL> DESCRIBE ogan_deneme;
18 NameNull? Type
19 ----------------------------------------- -------- ----------------------------
20 ISIM NOTNULL VARCHAR2(30)
21 SOYISIM NOTNULL VARCHAR2(60)
22 KULLANICI_KODU NOTNULL NUMBER(5)

Yukarıdaki komut basit bir görüntü yaratma komutudur ve yonetim isimli objeden, kullanici_kodu 100,200 ve 300 olanların; isim, soyisim ve kullanici_kodu bilgilerini almaktadır. Başka bir örnek;

01 SQL> DESCRIBE yonetim;
02 NameNull? Type
03 ----------------------------------------- -------- ----------------------------
04 ISIM NOTNULL VARCHAR2(30)
05 SOYISIM NOTNULL VARCHAR2(60)
06 KULLANICI_KODU NOTNULL NUMBER(5)
07  
08 SQL> CREATE ORREPLACEVIEWogan_deneme AS
09 2 SELECTisim||' '||soyisim "AD-SOYAD"
10 3 FROM yonetim
11 4 WHERE kullanici_kodu IN (100,200,300);
12  
13 View created.
14  
15 SQL> DESCRIBE ogan_deneme;
16 NameNull? Type
17 ----------------------------------------- -------- ----------------------------
18 AD-SOYAD VARCHAR2(91)

Yukarıdaki örnekte isim ve soyisim bilgilerini bir adet boşluk ile birleştirmek koşuluyla “AD-SOYAD” olarak tanımladık ve yine kullanici_kodu 100,200 ve 300 içerisinde olan kişileri istediğimizi belirttik. Burada dikkat edilmesi gereken husus Oracle’ın “AD-SOYAD” sütununu 91 byte olarak tanımlamasıdır. ISIM 30, SOYISIM 60 ve bir ara karaterle birlikte 91 olarak tanımlama gerçekleştirilmiştir. Bunu bir de NUMBER için nasıl yapıtığına bakalım;

01 SQL> ALTER TABLEyonetim ADD kimlik number(7,1);
02  
03 Table altered.
04  
05 SQL> ALTER TABLEyonetim ADD departman_id number(3);
06  
07 Table altered.
08  
09 SQL> DESCRIBE yonetim;
10 NameNull? Type
11 ----------------------------------------- -------- ----------------------------
12 ISIM NOTNULL VARCHAR2(30)
13 SOYISIM NOTNULL VARCHAR2(60)
14 KULLANICI_KODU NOTNULL NUMBER(5)
15 KIMLIK NUMBER(7,1)
16 DEPARTMAN_ID NUMBER(3)
17  
18 SQL> CREATE ORREPLACEVIEWogan_deneme AS
19 2 SELECTisim, soyisim, kullanici_kodu * departman_id "Calisan Kodu"
20 3 FROM yonetim;
21  
22 View created.
23  
24 SQL> DESCRIBE ogan_deneme;
25 NameNull? Type
26 ----------------------------------------- -------- ----------------------------
27 ISIM NOTNULL VARCHAR2(30)
28 SOYISIM NOTNULL VARCHAR2(60)
29 Calisan Kodu NUMBER

NUMBER bir alanı birleştirdiğimi zaman “precision” ve “scale” alanları birleştirildi ve yalnız NUMBER olarak gösterilmeye başlandı.

Bir görüntüyü “SELECT *” komutu ile yarattıktan sonra eğer tablo üzerinde yeni bir sütun eklediyseniz görüntüyüde yeniden yaratmanız veya içeriğini güncellemeniz gerekmektedir. Örnek;

01 SQL> CREATE ORREPLACEVIEWogan_deneme AS
02 2 SELECT* FROM yonetim;
03  
04 View created.
05  
06 SQL> ALTER TABLEyonetim ADD maas number(10);
07  
08 Table altered.
09  
10 SQL> DESCRIBE ogan_deneme;
11 NameNull? Type
12 ----------------------------------------- -------- ----------------------------
13 ISIM NOTNULL VARCHAR2(30)
14 SOYISIM NOTNULL VARCHAR2(60)
15 KULLANICI_KODU NOTNULL NUMBER(5)
16 KIMLIK NUMBER(7,1)
17 DEPARTMAN_ID NUMBER(3)
18  
19 SQL> SELECT dbms_metadata.get_ddl('VIEW','OGAN_DENEME','SYSTEM') OUTPUT
20 2 FROM DUAL;
21  
22 OUTPUT
23 -------------------------------
24 CREATEORREPLACEFORCEVIEW"SYSTEM"."OGAN_DENEME"("ISIM", "SOYISIM", "KULLANICI_KODU", "KIMLIK", "DEPARTMAN_ID") AS
25 SELECT"ISIM","SOYISIM","KULLANICI_KODU","KIMLIK","DEPARTMAN_ID"FROM yonetim

yonetim tablosuna maas sütununu eklememe rağmen daha önceden tanımladığım görüntü değişmedi. Bir üstteki sorgundan da anlaşıldığı üzere “*” isteğimiz karşılanmış ancak data dictionary’de, o anki bütün sütunlar çözümlenerek yaratılmış. Buradaki sizi çelişkiye düşürebilecek nokta “select *” olarak tanımladım, neden sonradan yarattığım sütunları da görüntüde göremiyorum” olacaktır. İşte sebebi de budur.

Bir görüntüyü henüz veritabanında olmayan bir obje için yaratabilirsiniz. Bunu yapabilmek için kullanacağınız komut FORCE komutudur. Bir görüntü eğer hata alıyorsa bu o görüntünün yaratılamadığı anlamına gelmektedir. FORCE komutunun kullanımı için;

01 SQL> CREATE VIEWogan_yeni AS
02 2 SELECT *
03 3 FROM olmayan_bir_tablo;
04 FROM olmayan_bir_tablo
05 *
06 ERROR at line 3:
07 ORA-00942: table orviewdoes not exist
08  
09 SQL> CREATE FORCEVIEWogan_yeni AS
10 2 SELECT *
11 3 FROM olmayan_bir_tablo;
12  
13 Warning: View created with compilation errors.
14  
15 SQL> SHOW ERRORS VIEW ogan_yeni;
16 Errors forVIEW OGAN_YENI:
17  
18 LINE/COL ERROR
19 -------- -----------------------------------------------------------------
20 0/0 ORA-00942: table orviewdoes not exist
21  
22 SQL> SELECT *
23 2 FROM ogan_yeni;
24 FROM ogan_yeni
25 *
26 ERROR at line 2:
27 ORA-04063: view "SYSTEM.OGAN_YENI" has errors

Şimdi de ilgili tabloyu yaratalım;

01 SQL> CREATE TABLE olmayan_bir_tablo AS
02 2 SELECT *
03 3 FROM yonetim;