4000 byte’tan daha büyük verilerle çalışıyorsak LOB alanlara ihtiyacımız olacaktır.
Standart (basit) veritabanı tipleriyle çalışmak diğer datalarda olduğu gibi Oracle’da da oldukça kolay. Fakat dosya saklama – ya da stringe dönüşümünde veri bozulmaları yaşayabileceğimiz 4000 byte tan büyük datalarla çalışacaksak Oralce LOB (Long Objects) lara ihtiyacımız olacaktır. PHP ile Oracle LOB alanlarda yapabileceğimiz işlemleri incelemden once kısaca LOB tipleri tanımlayalım
Oracle LOB Objects
Üzerinde işlem yapılan LOB alanlar biz boşaltana kadar geçici tablo alanında (Temporary Tablespace) saklanır . Oracle 9i ve öncesinde bu tipler için table spacede ayrı ayrı saklama yeri oluşturuluyormuş bu yuzden eski sürümlerde bu tipler üzerinde işlem yaparken daha dikkatli olmamız söyleniyor.
LOB Saklama
Oracle 10g her LOB hücresi için 128 TB kadar veri saklama kapasitesine sahipmiş. Bu Veri tabanı block boyutu ve yığınlama ayarlarında isteğe bağlı değiştirilebiliniyormuş. LOB verilerinin saklanması 2 elemanla olur. LOB Content ve LOB Locator. LOB Content sadece LOB Locator’un adresini içerir.
Dahili LOB tipleri (BFILE dışında kalanlar) 4KB nin altında olduğu sürece diğer tablo verileriyle aynı (stored in line in the table ) yerde saklanır. lob alanlarınız 4 kb den küçükse isteklerinizin işlenip size gelmesi gayet hızlı olacaktır. fakat büyükse bu tablo için yapılan SELECT sorgularında LOB sütunlarının dahil edilmesi sorgu sonucu almanızı yavaşlatacaktır.
LOB Kısıtlamaları
Lob alalar için en önemli kısıtlamalar. Sorgu dahilinde sıralama ve gruplama işlemleridir.
- Coğul Elemelerde kullanılmaz
- Sıralamalarda kullanılamaz
- Gruplamalarda kullanulamaz
- Birleştirmelede kullanılamaz
- Primary Key olarak atanamaz
- Unique index oluşturulamaz
SELECT DISTINCT <lob_type>
ORDER BY <lob_type>
GROUP BY <lob_col>
dahil edemeyeceğimiz bu işlemler ile yine bu işlemleri kullanan UNION -MINUS -INTERSECTION gibi tablo birleştirme işlemlerinide kısıtlamış olur.
PHP ve ORACLE LOB işlemleri (OCI-Lob Sınıfı):
Bu sınıfla ilgili php manual de maalesef cok sınıflı bilgi var. php ile OCI LOB işlemleri yapmamız için kullanabileceğimiz bu sınıf dikkatimi çektiği üzere bir cok PHP IDE tarafından da complatorlara dahil edilmemiş.!
Yerel Sunucumda PHP 5.3 versiyonunda OCI-Lob sınıfının metodlarını incelemek istedim.
OCI-Lob::load()
OCI-Lob::tell()
OCI-Lob::truncate()
OCI-Lob::erase()
OCI-Lob::flush()
OCI-Lob::setbuffering()
OCI-Lob::getbuffering()
OCI-Lob::rewind()
OCI-Lob::read()
OCI-Lob::eof()
OCI-Lob::seek()
OCI-Lob::write()
OCI-Lob::append()
OCI-Lob::size()
OCI-Lob::writetofile()
OCI-Lob::export()
OCI-Lob::import()
OCI-Lob::writetemporary()
OCI-Lob::close()
OCI-Lob::save()
OCI-Lob::savefile()
OCI-Lob::free()
metodların hepsini maalesef işleyemeyeceğim fakat kullandıkça örnekleri de buraya yazmaya çalışacağım.








[...] OCI-Lob sınıfını tanımıştık. bu sınıfın insert ve update sorguları için kullanılan metodu olan OCI-Lob::save() metodunu inceliyor olacağız. Update sorgularımız için şartımıza uyan bir satır yoksa php OCI_INVALID_HANDLE gibi bir hata fırlatıyor. update işlemlerini bir sonraki yazıda işleyeceğimiz için şimdilik sadece bahsedip geçiyoruz. OCI-Lob bool save ( string $data [, int $offset ] ) [...]