18 Ağustos 2011 Perşembe

External Table

External Table


Interneti biraz araştırdım ve external table başlığı üzerine Türkçe bir kayıt bulamadım. Varsa da benden daha önce bu konuyla ilgili paylaşımı Türkçe yapan arkadaşıma teşekkür ederim.

Oracle'da bir obje olan tablolardan hariç olarak bir de external table objeleri bulunmaktadır ve Oracle bize bu objenin içindekilere sadece okuma erişimi sağlamaktadır. "External", yani harici olduğu için tahmin edeceğiniz üzere bir external table içerisindeki veriler, veritabanının içinde bulundurulmaz. External table'ı bir nevi aracı gibi düşünebilirsiniz. Peki bu external table neye aracılık yapıyor? Örneğin bir dizinde bulunan 3.5 MB büyüklüğündeki basit bir excel dosyasına aracılık yapıyor olabilir. Harici bir tablo veritabanında fiziksel olarak bulundurulmaz. Bu tablonun içerisindekilere müdahale etme şansınız olmaz, yalnız görüntüleyebilir ya da sorgulayabilirsiniz. Tom Kyte'a göre (bir seminerinde bahsetmişti) bir veritabanına veri yüklemenin en hızlı ve sorunsuz yolu external table aracılığı ile yüklemekmiş.

Bir harici tablo üzerinde görüntü (view) yaratabilir, sıralayabilir (sorting) ya da başka bir tablo ile birleştirip (join) sorgulayabilir fakat herhangi bir DML operasyonu (insert, delete ya da update) yapamazsınız. Buna ek olarak bir harici tabloya indeks de tanımlayamazsınız. External table'lar data pump ile de kullanılabilir ve bir veri ambarı sisteminde ETL operasyonlarına dahil edilebilir. (E=Extract T=Transform L=Load). Harici tabloları yaratmak için IOT'lere benzer bir yöntem kullanıyoruz (Index Organized Table). Yani, ORGANIZATION EXTERNAL sıfatını kullanıyoruz. Bir harici tablo aracılığı ile veri yüklemek istediğimiz zamansa SELECT ifadesindeki veri tipleri, data dictionary'de otomatik olarak tanımlanmaktadır.

Bir Oracle veritabanı external table'lardan veri yüklenmesi ve erişilebilmesi için bize iki tane sürücü tanımlamıştır. Bunlar ORACLE_LOADER ve ORACLE_DATAPUMP'dır. ORACLE_LOADER'ın ilk etapta anlamamış olabilirsiniz ama aslında ORACLE_LOADER = SQL * Loader'dır (sqlldr). Hazır yeri gelmişken daha önce sqlldr ile ilgili yazdığım bir makaleyi paylaşmak istiyorum. Lütfen tıklayınız. ORACLE_DATAPUMP'da ise data pump'ın kabiliyetleri ile yola devam edilir. Her ikisinin ve aynı zamanda external table'ların ortak noktası bir veya duruma göre birden çok dizine sahip olmalarıdır. Oracle'da dizinler (directories) nasıl yaratılır gösterelim ve birkaç örnekle yola devam edelim;


CREATE OR REPLACE DIRECTORY ogan_log_dizin
AS
'/u01/ogan/log';


CREATE OR REPLACE DIRECTORY ogan_veri_dizin
AS
'/u01/ogan/veri';


CREATE OR REPLACE DIRECTORY ogan_bad_dizin
AS
'/u01/ogan/bad';

Dizinlerimizi yarattık. Bu dizinleri Oracle veritabanına göstermeden external table'lara geçerseniz hata alırsınız. Her ne kadar yüklemek istediğimiz veri bir excel'de duruyor ve bu excel de fiziksel olarak ilgili dizinde duruyor olsa da Oracle'da directory yaratmazsanız Oracle o excel'e erişemiyor (external table aracılığı ile). Şimdi, dizini kullanabilmemiz için hak tanımlamamız gerekiyor. Bu arada önemli bir nokta, dizinlere bir kullanıcı sahip olamaz. Dizinler Oracle'ın malıdır ve herhangi bir kullanıcı, şema ile ilişkilendirilemez. Biz sadece istediğimiz kişiye ilgili dizinle ilgili haklar tanımlayabiliriz.


GRANT READ, WRITE ON DIRECTORY
ogan_log_dizin TO ogan;


GRANT READ, WRITE ON DIRECTORY
ogan_veri_dizin TO ogan;

GRANT READ, WRITE ON DIRECTORY
ogan_bad_dizin TO ogan;

Gerekli tanımlamarı yaptıktan sonra elimizdeki excel ya da dat uzantılı dosya içeriğine uyumlu bir external table yaratma işlemiyle işimize devam ediyoruz. Elimizdeki excel örneğine gelince;

Ogan Ozdogan1, 101, ABC, 01.08.2011
Ogan Ozdogan2, 102, ABC, 02.08.2011
Ogan Ozdogan3, 103, ABC, 03.08.2011
Ogan Ozdogan4, 104, ABC, 04.08.2011

Yukarıdaki veri setini bir excel dosyası olarak düşünün ve virgüllerle ayrıldığını varsayalım. @, / ya da . gibi karakterlerle de ayırmış olabilirdik. Şimdi bu verisetine göre bir external table yaratalım;

CREATE TABLE ogan_external_tablo
(
isim varchar2(50),
id number(3),
firma varchar2(10),
ise_baslama date
)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY ogan_veri_dizin
ACCESS PARAMETERS
(
RECORDS DELIMITED BY newline
BADFILE ogan_bad_dizin: 'ogan_veri%a.bad'
LOGFILE ogan_log_dizin: 'ogan_veri%a.log'
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE null
(

isim, id, firma, ise baslama char date_format date mask 'DD.MM.YYYY'
)
)
LOCATION 'ogan_veri.csv'
)
PARALLEL
REJECT LIMIT UNLIMITED

Harici tablomuzu yukarıdaki komutla yarattık. Şimdi bu yarattığımız harici tablodan, gerçek tabloya veri girişinde bulunalım;


INSERT INTO ogan_tablo (isim, id, firma, ise_baslama)
SELECT * FROM ogan_external_tablo;

Bir harici tablo üzerinde ALTER komutu koşabilmek mümkün ve bu komutla external table'ın varsayılmış olan özelliklerini değiştirebiliyoruz;

ALTER TABLE ogan_external_tablo
REJECT LIMIT 10;

ALTER TABLE ogan_external_tablo
DEFAULT DIRECTORY ogan_veri_dizin_yeni;

İyi çalışmalar.

Ogan

8 yorum:

Caner Seçgin dedi ki...

Hocam elinize sağlık sürekli yazılarınızı takip ediyorum çok beğeniyorum. Yalnız bu yazıyı yayınlamayacağınızdan bir ek söylemek istedim OCA sınavında çıkan bir soru external table' da synonym de yapılabiliyormuş. Belki Eklemek istersiniz diye düşündün. Emeğinize sağlık BAŞARILAR...

Caner Seçgin dedi ki...

Hocam elinize sağlık sürekli yazılarınızı takip ediyorum çok beğeniyorum. Yalnız bu yazıyı yayınlamayacağınızdan bir ek söylemek istedim OCA sınavında çıkan bir soru external table' da synonym de yapılabiliyormuş. Belki Eklemek istersiniz diye düşündün. Emeğinize sağlık BAŞARILAR...

Caner Seçgin dedi ki...

Hocam elinize sağlık sürekli yazılarınızı takip ediyorum çok beğeniyorum. Yalnız bu yazıyı yayınlamayacağınızdan bir ek söylemek istedim OCA sınavında çıkan bir soru external table' da synonym de yapılabiliyormuş. Belki Eklemek istersiniz diye düşündün. Emeğinize sağlık BAŞARILAR...

Caner Seçgin dedi ki...

Hocam elinize sağlık sürekli yazılarınızı takip ediyorum çok beğeniyorum. Yalnız bu yazıyı yayınlamayacağınızdan bir ek söylemek istedim OCA sınavında çıkan bir soru external table' da synonym de yapılabiliyormuş. Belki Eklemek istersiniz diye düşündün. Emeğinize sağlık BAŞARILAR...

Caner Seçgin dedi ki...

Hocam elinize sağlık sürekli yazılarınızı takip ediyorum çok beğeniyorum. Yalnız bu yazıyı yayınlamayacağınızdan bir ek söylemek istedim OCA sınavında çıkan bir soru external table' da synonym de yapılabiliyormuş. Belki Eklemek istersiniz diye düşündün. Emeğinize sağlık BAŞARILAR...

CANER SEÇGİN dedi ki...

Hocam elinize sağlık sürekli yazılarınızı takip ediyorum çok beğeniyorum. Yalnız bu yazıyı yayınlamayacağınızdan bir ek söylemek istedim OCA sınavında çıkan bir soru external table' da synonym de yapılabiliyormuş. Belki Eklemek istersiniz diye düşündün. Emeğinize sağlık BAŞARILAR...

CANER SEÇGİN dedi ki...

Hocam elinize sağlık sürekli yazılarınızı takip ediyorum çok beğeniyorum. Yalnız bu yazıyı yayınlamayacağınızdan bir ek söylemek istedim OCA sınavında çıkan bir soru external table' da synonym de yapılabiliyormuş. Belki Eklemek istersiniz diye düşündün. Emeğinize sağlık BAŞARILAR...

Caner Seçgin dedi ki...

Hocam elinize sağlık sürekli yazılarınızı takip ediyorum çok beğeniyorum. Yalnız bu yazıyı yayınlamayacağınızdan bir ek söylemek istedim OCA sınavında çıkan bir soru external table' da synonym de yapılabiliyormuş. Belki Eklemek istersiniz diye düşündün. Emeğinize sağlık BAŞARILAR...

Takip et: @oganozdogan