15 Ekim 2008 Çarşamba

*.csv Dosyalarının Oracle Veritabanına Yüklenmesi (SQLLDR)

Merhaba,

Takip etmek istediğim konu ile biraz alakasız olacak fakat önemli bir konu ve hiç bahsetmediğim için yazacağım.

Belirli durumlarda Oracle veritabanına external verileri yüklememiz gerekebilir. Yani, bu veriler çoğu zaman bir Java veya C# arayüzünden gelmeyebilir. Bu veriler herhangi bir programlama dilinin arayüzünden gelmediği gibi, uzantıları da farklı olabilir. Bu durumda kullanabileceğimiz Oracle aracına SQL-LOADER diyoruz (komut olarak kullanım şekli ise SQLLDR).

Bir excel dosyasındaki bütün verileri .csv (comma seperated value) olarak değiştirebiliriz. Bu değişikliği yaptıktan sonra kısa bir örnek ile devam edelim. Bu arada sqlldr'ın çalışabilmesi için öncelikle bir control dosyası (.ctl) yaratmamız gerekiyor.

CONTROL FILE:

Bir text dosyası ve c'nin altında trial isimli bir folder açalım ve içine;

load data
infile 'c:\trial\veri.csv'
into table deneme
fields terminated by ","
optionally enclosed by '"'
(deneme_sayi,deneme_karakter)

Kaydedelim ve kapatalım. Uzantısını da .ctl olarak değiştirelim ve adını kontrol koyalım. Ardından yüklenmesini dilediğiniz schema'ya bağlanıp yukarıdaki deneme tablosunu yaratalım;

ORACLE TABLE:

C:\> sqlplus deneme/password@oracle_sid
SQL> drop table deneme purge;
SQL> create table deneme
SQL> (
SQL> deneme_sayi number(10), deneme_karakter varchar2(45)
SQL> );
Table created.

Tablomuzu da yarattıktan sonra control dosyasında belirttiğimiz veri.csv'ye bakalım. Önce bir excel dosyası yaratalım ve adını veri.xls koyalım. Ardından örneğimiz için içine şu verileri dolduralım;

EXCEL FILE:

987 Bu bir denemedir
654 Bu da bir denemedir
321 Bu da bir baska denemedir

Kaydedelim ve uzantısını da .csv olarak değiştirelim.

Bir komut satırı açarak şu şekilde deneyebiliriz;

SQLLDR INVOKE:

C:\trial> sqlldr deneme/password@oracle_sid control=kontrol.ctl log=logfile.log

Bu komutun ardından trial folderının altında logfile oluşacak ve buradan durumu gözleyebilirsiniz. Eğer herhangi bir problemle karşılaşacak olursanız da, .bad uzantılı bir dosya göreceksiniz.

Şimdi tablomuzu kontrol edelim ve verilerin yüklenip yüklenmediğini görelim,

C:\> sqlplus deneme/password@oracle_sid
SQL> select * from deneme;

Eğer verileri görebildiyseniz bu aşamada şunu yapabilmiş oldunuz. SQLLDR tool'u ile .csv uzantılı bir dosyanın içindeki verileri sağlıklı bir biçimde Oracle'da daha önceden yarattığınız tabloya atabildiniz.

Unutmadan, unix tabanlı işletim sistemi kullanan arkadaşlarda sqlldr'ı şu şekilde çalıştırabilir;

SQLLDR INVOKE:

% sqlload userid=deneme/password control=kontrol.ctl log=logfile.log

Tekrar görüşmek dileğiyle,

Ogan

10 Ekim 2008 Cuma

Veri Tipleri ve Temel SQL Queryleri

ORACLE VERİ TİPLERİ

Kullandığımız veritabanında, verileri saklayabilmemiz için tablolar yaratmamız gerekmektedir. Bu tablolarında bünyesinde de birtakım veri tipleri mevcuttur. Bu veri tipleri, saklanabilecek verinin bir anlamda kimliğini açığa çıkartmaktadır.

Veri tipleri arasında;

- CHAR(X): Büyüklüğü 1 byte ile 2000 byte arasındadır ve bu aralıktaki karakter değerlerini saklayabilmek için kullanılır. CHAR'ın özelliği, tablo yaratılırken eğer CHAR(5) olarak bir değişken yarattıysak, verilen değelerin tamamı doldurulacak demektir. Eğer 5'ten büyük bir karakter girmeye çalışırsanız hata alırsınız fakat düzeltemenin yoluda modify etmektir.

- VARCHAR2(X): Büyüklüğü 1 byte ile 4000 byte arasındadır. CHAR'dan en büyük farkı ve en büyük kullanılma sebeplerinden biri ise, VARCHAR(200) ile VARCHAR(2)'nin yaratıldıkları zaman aynı yeri kaplıyor olmasıdır. Yani, bir değer girilene kadar veritabanında aynı miktarda yeri işgal ediyorlar. Burada gelebilecek soru; neden varchar değilde varchar2 olabilir. varchar reserved keyworddür ve ileriki bir zamanda kullanılmak üzere saklanmıştır.

NUMBER(X,Y): X tam kısmı, Y ise ondalıklı kısmı temsil eder. Örneğin; number(4,1) yazarsak 3 tam sayılı ve bir ondalıklı sayı olacak demektir. Belirtilen ondalıklı sayıdan daha büyük ondalıklar girildiğinde, Oracle bu ondalığı, belirtilen ondalığa kadar rounded-up olarak yuvarlar. Ondalık belirtmeden de bir değişken tanımlanabilir. Bu bir tam sayı olacağını ifade edecektir.

DATE: Bu veri tipi, tarih ve zaman bilgilerini barındırır. Toplam 7 byte büyüklüğündedir ve en küçük birimi saniyedir.

LONG, RAW, TIMESTAMP, CLOB, ROWID gibi diğer veri tipleri de mevcuttur.

SQL QUERYLERİ
Veritabanına kaydettiğimiz verileri alma, görünteleme, raporlama vb işleri yerine getirmemize yarayan, Oracle veritabanının olduğu gibi diğer bütün veritabanlarının en temel yapıtaşı, atomu olan sorgulama sistemine SQL Queryleri denir(QUERY-Cümle). SQL Queryleri ile, ilişkisel veritabanı özellikleri, tablo birleştirme, yaratma, düşürme, boşaltma, pl/sql içinde dinamik olarak gömebilme, yönetim komutlarını yerine getirebilme, kullanıcılar yaratabilme, yaratılanlara haklar tanıyabilme ve düşürebilme, system kullanıcısının segmentlerindeki bilgileri toplama, görüntüleme gibi nice komutu yerine getirebiliriz.
Basit bir SQL yapısı ve sorgu örneği ise şu şekilde verilebilir:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
Yukarıdaki yapı, bir sql sorgusunda sırayla takip edilmesi gereken yapıdır. Bu yapıda select'in ardından gelecek bir group by veya havingden önce gelebilecek bir order by sorgunun hata vermesine ve çalışmamasına sebep olacaktır.
SELECT *
FROM DENEME;
Yukarıdaki sorguda istenilen şey, DENEME tablosundaki bütün kolonlardaki verilerin çekilmesi. Buradaki "*" bütün kolonları simgelemektedir. Yani, yukarıda belirttiğim veri tiplerinden tabloya işlenmiş olanları ve içlerinde barındırdığı verilerin tamamı demektir.
Eğer DENEME tablosunda 2 veri tipi kayıtlı ise örneğin, kullanici_adi varchar2(40) ve kullanici_soyadi varchar2(45), yukarıdaki sorguyu şu şekilde de yazabiliriz:
SELECT KULLANICI_ADI, KULLANICI_SOYADI
FROM DENEME;
Ya da,
SELECT D.*
FROM DENEME D;
Bu da, DENEME tablosuna D tagı ekliyoruz ve D'nin bütün verilerini çekmek istiyoruz demektir.
Sütünların hepsini çekebilidiğimiz gibi bir kısmınıda, belirtli koşullarla ve taglarla çekebiliriz. Örneğin;
SELECT KULLANICI_ADI AS AD, KULLANICI_SOYADI AS SOYAD
FROM DENEME;
Unutmayalım ki yukarıda kullandığım "AS" keyword'ü Oracle 9i ile birlikte depracate edilmiştir ve kullanılmamaktadır. Bunun yerine;
SELECT KULLANICI_ADI AD, KULLANICI_SOYADI SOYAD
FROM DENEME;
diyebiliyoruz. Bu şekilde yazılan bir sorgunun ekrana yansıması ise sütün adı olarak KULLANICI_ADI değilde, AD olması olacaktır.
SQL QUERYLERİ İLE VERİLERİN SINIRLANMASI
Bir select cümlesi ile bütün verileri almak istemiyorsak ve birtakım veriler arasından da bir gruplarını seçmek istiyorsak kullandığımız çok nitelikli ve bol miktarda fonksiyon ve grup fonksiyonları vardır.
Örneğin;
Bir tabloda eğer birden fazla grup_id'si bulunuyorsa ve biz sadece tekil olarak grup_idleri görmek istiyorsak DISTINCT kullanmalıyız.
SELECT DISTINCT GRUP_ID
FROM DENEME;
Distinct için unutulmaması gereken en önemli nokta ise, ardından gelen bütün sütünlar da distinct, yani tekil olacaktır. Yukarıdaki örnekte grup_id'nin yanına user_id'de ekleseydik, ikisinin birden tekil olacağı anlaşılacaktı.
Bir diğer veri sınırlandırma yöntemi ise WHERE koşuludur. Bu koşul ile tabloda bulunan verilerin içeriğine göre sorgular yazabilir ve görmek istediğimiz kadarını görmeyi başarabiliriz.
Örneğin;
SELECT KULLANICI_ADI AD, GRUP_ID ID
FROM DENEME
WHERE GRUP_ID IS NULL;
Deneme tablosundan kullanici_adini AD olarak ve grup_id'yi ID olarak çektiğimiz ancak grup_idlerinin NULL değer, yani değersiz, boş olduğu verileri bu şekilde alabiliriz. NULL demek sıfır demek değildir!..
Bundan sonraki konumuzda, Mantıksal operatörler olan AND, FALSE, NULL gibi konularla diğer sınırlandırma operatörlerini inceleyeceğiz.
İyi günler,
Ogan
Takip et: @oganozdogan