10 Temmuz 2013 Çarşamba

Oracle Eğitimi

Oracle Eğitimi, dünyadaki en güçlü veritabanı yazılımlarından olan Oracle'ın eğitimidir. Oracle, büyük şirketlerden devletlere kadar pek çok kurum tarafından kullanılmaktadır. Oracle Eğitimi ile geniş bir platform olan Oracle platformunda, varlığınızı güçlendirirsiniz.

Eğitimin amacı, öğrenciye Oracle'ın detaylarını öğretip, uygulamaya yönelik bir eğitim vermektir. Oracle Eğitimi, size, yeni yetenekler sağlayıp, fırsatlar açacaktır.

Oracle Join ve Subquery Örnekleri


Efenim halihazırda Oracle’a alışma işlemlerimiz devam ediyor. Oracle Express ile beraber gelen HR veritabanında biraz JOIN biraz subquery işlemleri yapalım

1. Örnek: Çalışanlar arasında daha önce deneyimi olan herkesin maaşını ve maaşına %10 zam yapılmış halini isimleriyle beraber veren sorguyu yapalım :SELECT first_name "Personel", salary "Onceki Maas", (salary * 1.1) "Sonraki Maas" from employees where employee_id IN ( SELECT employee_id from job_history )





2. İsmi LEX olan çalışanı ile aynı departmanda çalışan personelin isim soyismini bulan sorgumuz :SELECT last_name, department_id FROM employees WHERE department_id = (SELECT department_id FROM employees WHERE first_name = 'Lex') ORDER BY last_name, department_id;




3. Basit bir Inner JOIN işlemini özeleyelim : Bir e bir eşit olan kayıtlar döner sonuç olarak:SELECT emp.employee_id, emp.first_name, jobs.start_date, jobs.end_date FROM employees emp, job_history jobs WHERE emp.employee_id = jobs.employee_id




4. Şimdi RIGHT OUTHER JOIN örneği yapalım. Anlamı: sağ taraftaki tablodaki değerlere karşılık sol taraftaki tablodaki değerleri getirir.
Not: Haliyle her çalışanın bu şirkette daha önce başka bir departmanda tecrübesi olmaması sebebiyle her çalışan için bir kayıt gelecek bazıları NULL görünecektirSELECT emp.employee_id, emp.first_name, jobs.start_date, jobs.end_date FROM employees emp, job_history jobs WHERE emp.employee_id = jobs.employee_id (+)




5.Şimdide LEFT OTHER JOIN yapıyor. Haliyle burada daha önce iş tecrübesi olan personel için kayıtlar döneceği için NULL sonuç göremeyeceğiz.SELECT emp.employee_id, emp.first_name, jobs.start_date, jobs.end_date FROM employees emp, job_history jobs WHERE emp.employee_id (+) = jobs.employee_id




6. Son olarak location_id si 1700 olan departmanda çalışmayan kullanıcıların isimlerini isim sıralı olacak şekilde gösterelim:SELECT first_name FROM employees WHERE department_id NOT IN (SELECT department_id FROM departments WHERE location_id = 1700) ORDER BY last_name;


ORACLE KULLANIMI

ORACLE KULLANIMI


Bu makalede sizlere Oracle VM Şablonlarının nasıl kullanıldığından bahsedeceğiz.


Oracle VM Şablonları Nasıl Kullanılır


Oracle VM bir şablon edinme Şablonlar, ve nasıl Oracle VM çevreye şablonu dağıtmak için kullanmak bir Oracle VM ortamı nasıl hazırlanır.


Bu makalede, Oracle VM bir şablon edinme Şablonlar, ve nasıl Oracle VM çevreye şablonu dağıtmak için kullanmak bir Oracle VM ortam hazırlamak açıklamaktadır. Ayrıca bu şablonu temel alan bir sanal makine oluşturmak için nasıl ve şablonu klon ve klon yapılandırma değiştirebilirsiniz açıklar. Oracle Linux sistemi görüntüsü ve Oracle Veritabanı resim: Örnek olarak, makaleyi iki disk görüntüleri içeren Oracle Veritabanı için bir şablon kullanır.
Sanallaştırma teknolojisi CPU yüksek kullanımı ve diğer donanım kaynakları, kolay  yazılım dağıtımları, ve basitleştirilmiş sistem yönetimi de dahil olmak üzere pek çok avantaj sunmaktadır.Sanallaştırılmış bir ortama dağıtım için tam hazır önceden oluşturulmuş, önceden sanal makineleri (VM): yazılım yönetimi ve dağıtım daha da kolaylaştırmak için, Oracle VM Şablonları tanıttı. Normal bir şablon VM dağıtım için gerekli yapılandırma bilgileri ile birlikte bir konuk işletim sistemi ve uygulama yazılımı içerir.


Oracle VM Şablonları Hakkında


Oracle VM Şablonları kullanmak için ana cazibe dağıtma ve yönetme VM daha kolay hale getirmektir.Oracle birkaç isim Oracle Database, Oracle Business Intelligence Enterprise Edition, Oracle WebLogic Server, Oracle Linux ve MySQL Veritabanı da dahil olmak üzere en popüler Oracle ürünleri, için VM şablonları çok sayıda sunmaktadır.

Sizin Çalışma Ortamı Hazırlama


Bir şablon yararlanabilirler önce, en az bir Oracle VM Sunucu artı Oracle VM Yöneticisi yükleme gerektirir Oracle VM, yüklemeniz gerekir.
Oracle VM Sunucu yüklemek için, temiz bir makine gerekir. Oracle VM Sunucu hypervisor ve bir ana işletim sistemi gerektirmeyen bir çıplak metal sunucuya doğrudan yüklemek için ayrıcalıklı bir etki alanı (Dom0) bir sağlar.
Oracle VM Sunucu böylece özel bir makine gerektiren, tüm sabit disk üzerinde alır. Sadece onunla biraz oynamak istiyorum ve bunun için özel bir makine sağlayamazsa, basit bir geçici çözüm geçici olarak başka bir sabit disk gibi çıkarılabilir sabit disk olarak kullanmak olabilir. Bir SATA aygıtı olarak bilgisayarın arka paneli üzerinden harici aygıtları bağlamak izin anakartlar vardır. Bu mümkün değilse, bir USB bağlantı noktası üzerinden bağlamak gerekir. Daha sonra, BIOS ilk önyükleme aygıtı olarak ayarlamak için emin olun. Güvenli tarafta olmak için, geçici olarak normal sabit disk çekmeli. Bu yaklaşım, kolayca daha sonra düzenli yapılandırma geri dönmek için izin verir.
Oracle VM Server'ı yükledikten sonra, sunucu yükleme sırasında oluşturulan sanallaştırma ortamını yönetmek için kullanılacak Oracle VM Müdürü yüklemeniz gerekir. Oracle VM Yöneticisi özel bir makine gerektirmez. Ancak, Oracle Oracle VM Server ve Oracle VM Yöneticisi ayrı makineleri (aynı makinede hem yükleme zor ve desteklenmeyen) yüklü olmasını önerir. Diğer bir deyişle, başka bir makine gerekir. Oracle VM Manager 3.0 itibariyle, Oracle Linux 5 Güncelleme 5 (64-bit) veya sonraki bir sürümünü çalıştıran bir bilgisayarda Oracle VM Yöneticisi yükleyebilirsiniz.
Oracle VM belirli bir sürümü için yazılım ve donanım gereksinimleri hakkında bilgi için, uygun bakın Oracle VM kurulum kılavuzu .
Oracle VM Yöneticisi 3.0 basit kurulum sırasında aşağıdaki yazılım bileşenleri yüklenir:
  • Oracle Veritabanı, Hızlı Baskı 11 g
  • Java
  • Oracle Uygulama Geliştirme Çerçevesi
  • Oracle WebLogic Server
  • , Aslında, bir Oracle WebLogic Server uygulaması Oracle VM Müdürü,
Not: Oracle Database, Express Edition 11 g Oracle VM Yöneticisi 3 müşteri değerlendirme amacıyla ile birlikte, ancak Oracle Database Standard Edition veya Oracle Veritabanı, Enterprise Edition yönetim havuzu olarak üretim desteği için gereklidir. Oracle WebLogic Server ve Oracle Veritabanı (Standard Edition veya Enterprise Edition) için lisans da dahil olmak üzere gerekli tüm lisanslar, hiçbir ek ücret ödemeden dahildir. Daha fazla bilgi için, My Oracle Destek Doc ID 1.356.588,1 bakın: Oracle VM 3.0 WebLogic ve Oracle Veritabanı Ürün Lisanslama ve Destek Politikası (gerektirir giriş).

Sizin Oracle VM Çevre Ayarlama

Oracle VM Server ve Oracle VM Yöneticisi, yükledikten sonra bir sonraki görev makine barındırma Oracle VM Server Oracle VM Yöneticisi'nin ana bilgisayardan pingable olup olmadığını görmektir. Eğer durum bu ise, Oracle VM Manager yardımı ile Oracle VM ortamı kurmak için devam edebilirsiniz.
: Oracle VM Manager ile çalışmaya başlamak için, bu adrese tarayıcınızı http://example.com:7001/ovm/console .
: Alternatif olarak, burada tarayıcısını tarafından Güvenli Yuva Katmanı (SSL) kullanabilirsinizhttps://example.com:7002/ovm/console .
Eğer Oracle VM Manager yükleme sırasında belirtilen yönetim kullanıcı adı ve şifre girmeniz gerekir Oracle VM Müdürü, giriş sayfasına yönlendirilir olacak.
Başarılı bir girişten sonra, Oracle VM Şablonları kullanarak için ortam hazırlamak aşağıdaki görevleri tamamlamak:
  1. Yüklü Oracle VM Sunucu keşfedin .
  2. Bir sunucu havuzu oluşturun .
  3. Sunucu havuzuna keşfetti sunucu ekleyin .
  4. Oracle VM kaynakları saklamak için bir depolama depo oluşturun .
  5. Bir dosya sunucusu veya depolama dizisi Kayıt .
    Not: Oracle VM Server yerel depolama kullanıyorsanız bu adım gerekli değildir. Depolama seçenekleri daha sonra tartışılmıştır.
  6. Oracle VM Server depo mevcut .

Oracle VM Sunucu keşfetmek

Oracle VM Sunucu keşfetme görevi tamamlamak için, aşağıdaki adımları gerçekleştirin:
  1. Oracle VM Yöneticisi, Donanım görünümüne geçmek.
  2. Eylemler menüsünden keşfedin seçin.
  3. Discover Sunucular iletişim kutusunda, sunucu yükleme sırasında sağlanan Oracle VM Server'ın ana ve VM ajan şifre IP adresini belirtin.
    Oracle VM Manager Donanım görünümü Oracle VM Sunucu keşfedilmiştir sonra neye benzeyeceğini Şekil 1:
    ORACLE KULLANIMI
    Şekil 1. Oracle VM Manager Donanım Görünümü

Sunucu havuzu oluşturma

Şimdi Oracle VM Sunucu keşfedilmiştir ki, bir Oracle VM ortamı sağlamak gerekli bir adımdır bir sunucu havuzu, oluşturabilirsiniz. Bunu yapmak için şu adımları izleyin:
  1. Ana Sayfa görünümüne taşıyın.
  2. Eylemler menüsünden Sunucu Havuzu Oluştur'u seçin.
  3. Oluştur Sunucu Havuzu iletişim kutusunda, sadece gerekli alanları, sen Etkinleştir Küme onay kutusunu seçili olduğu süreceSunucu Havuzu Adı ve Sanal IP bulunmaktadır. Aksi takdirde, aynı zamanda küme veri ve küme heartbeating için gerekli olan sunucu havuzu dosya sisteminin Yer belirtmeniz gerekir.

Sunucu Havuzu için Bulundu Sunucu Ekleme

Artık aşağıdaki adımları uygulayarak yeni oluşturulan sunucu havuzu için Oracle VM Sunucu ekleyebilirsiniz:
  1. Gezgininde Anasayfa-> Sunucu Havuzları düğümünde, yeni oluşturulan sunucu havuzu seçin.
  2. Eylemler menüsünden Sunucu Ekle / Kaldır 'ı seçin.
  3. Ekle / Kaldır Sunucular iletişim kutusunda, Kullanılabilir Sunucular bölmesinden Seçilen Sunucular için Oracle VM Sunucu taşıyın.

Oracle VM Kaynakları saklanması için bir depolama Depo Oluşturma

Bir sonraki gerekli adım Oracle VM şablonları da dahil olmak üzere Oracle VM kaynakları, saklamak için bir depolama depo oluşturmaktır. Burada, birkaç seçeneğiniz vardır. En basit durumda, bir NFS paylaşımı yararlanabilirsiniz. Diğer seçenekler yerel depolama, iSCSI SAN ve Fiber Kanal SAN içerir.
Bir depolama depo için ayrı bir yerde (örneğin bir NFS paylaşımına gibi) kullanmak daha güvenilir olsa da, böylece yerel depolama seçeneği yararlanarak, yerine Oracle VM Server bir yerel disk kullanabilirsiniz. Olsa da, Dikkat: Oracle VM Server 3.0 bunu yüklü fiziksel disk üzerindeki kullanılmayan alanı kullanmak için izin vermez. Yerel depolama için, en az bir tane daha fiziksel disk gerekir. Yerel depolama kullanmak istiyorsanız Başka bir deyişle, size Oracle VM Server ana üzerinde en az iki disk toplam gerekir. Uygulamada olsa da, yerel depolama bir birincil kullanımı durum böyle değil. Bu yaklaşımın en önemli dezavantajı, yerel depolama, tanımı gereği, farklı sunucular arasında paylaşılamaz.
NFS paylaşımı seçeneği için, bir NFS dosya sunucusu günümüzde kullanılan işletim sistemlerinin çoğunluğu kolayca kurulabilir.Uzaktaki bilgisayarları monte böylece yerel olarak monte edilmiş gibi bir ağa bir dosya sistemi ortaya çıkarmak için yeteneği ilginç depolama fırsatlar sunar. Örneğin, kolayca Oracle VM ortamında bir depolama depo ev sahipliği yapacak bir dosya sunucusuna Microsoft Windows çalıştıran bir dizi açmak olabilir. Bir NFS sunucusu kurma hakkında daha fazla bilgi için, satıcı belgelerine kontrol edebilirsiniz.

Bir Dosya Sunucusu veya Depolama Dizisi Aramıza

Bir sonraki adım, bir dosya sunucusu veya kullanmak için gidiyoruz ne bağlı bir depolama dizisi, kayıt etmek. Belirtildiği gibi Oracle VM Server yerel depolama kullanıyorsanız, bu adım gerekli değildir. NFS paylaşımı seçeneği durumda, bir dosya sunucusu kayıt gerekir.Aşağıdaki adımlar zaten ağ çalışan bir NFS dosya sunucusu varsayarak, bunu nasıl açıklar:
  1. Donanım görünümüne taşıyın.
  2. Gezgininde, Depolama sekmesini tıklatın.
  3. Depolama sekmesinde, Dosya Sunucuları sağ tıklatın ve sonra Dosya Sunucusu Kayıt seçin.
  4. Kayıt Dosya Sunucusu Sihirbazın ilk ekranında, Ad ve Erişim Ana alanları doldurun ve Depolama liste kutusunda Plug-in plug-in depolama seçin.
  5. Sihirbazın bir sonraki ekranda, Kullanılabilir Sunucular bölmesinde dosya sunucusu görmelisiniz. Seçilen Sunucular bölmesine taşıyın ve sihirbazı tamamlayın.
    Dosya sunucusu kaydı tamamladıktan sonra, Oracle VM Yöneticisi otomatik olarak sunucunun dosya sistemleri için bir keşif iş başlar. Yani, sunucu havuzu için bir depolama depo oluşturmak için kullanılabilecek bir dosya sistemine sahip olmalıdır. Bu dosya sistemi Donanım bakış Depolama sekmesinde Dosya Sunucuları-> your_file_server düğümü altında görünmelidir.
  6. Daha sonra, sunucunun dosya sistemine dayalı bir depolama depo oluşturmak:
    1. Navigator içinde sağ tıklatarak ve sonra açılan menüden Yenile dosya sistemi seçerek keşfedilen dosya sistemi yenileyin.
    2. Ana Sayfa görünümüne taşıyın.
    3. Navigator, Sunucu Havuzları düğümünü seçin.
    4. Yönetim bölmesinde, Depoları sekmesine geçin.
    5. Depoları sekmesinin araçları panelinde, Oluştur simgesini tıklatın.
    6. Oluştur Deposu iletişim kutusunda, gerekli adı olan alanları, Deposu Yer ve, sen Deposu Konum Ağ Dosya Sunucusu seçtiyseniz, Ağ Dosya Sistemi tamamlayın.

Oracle VM Server Repository sunulması

Önceki adımları sonucunda, yeni oluşturulan depo Depoları sekmesindeki tabloda görünmelidir. Şimdi sunucu kullanabilirsiniz böylece Oracle VM Server depo sunmak gerekiyor. Bunu yapmak için şu adımları izleyin:
  1. Depoları sekmesindeki Depoları tabloda, yeni oluşturulan depo seçin.
  2. Depoları sekmesinin araçları panelinde, Mevcut / Unpresent Seçilen Deposu simgesini tıklatın.
  3. Sunucu (s) iletişim kutusuna Günümüze bu depoyu, Sunucular bölmesinden Sunucu (lar) bölmesine Sunan için Oracle VM Sunucu taşıyın.
  4. Depoları sekmesinin araçları panelinde, depo yenilemek için Yenile Seçilen Deposu İçerik simgesini tıklatın.

Oracle VM Şablon elde

Başarıyla önceki adımları tamamladıktan sonra, Oracle VM şablonları ile çalışmaya başlamak için hazırsınız. İlk adım bir şablon elde etmek olacaktır Oracle Software Delivery Bulut (gerektirir giriş).
  1. Bizim örneğimizde, gidin Oracle Linux ve Oracle VM sayfa Oracle Software Delivery Bulut.
  2. Oturum ve Şartlar ve Kısıtlamalar ekranda sözleşmesini kabul.
    Sen Medya Paketi Arama ekranına yönlendirileceksiniz.
  3. Seç Ürün Paketi listeden Oracle VM şablonları seçin.
  4. Platform listeden platformu seçin.
    Daha sonra Oracle VM Manager 3.0 kullanıyorsanız veya iseniz, x86 64 bit seçmelisiniz.
  5. Bir ürün paketi ve platform seçtikten sonra, bir şablon aramaya başlamak için Git düğmesini tıklatın.
    Şekil 2 Arama sayfası, x86 64-bit platformunda Oracle VM Şablonları için bir arama yapılan aldıktan sonra neye benzeyeceğini gösteriyor.
    ORACLE KULLANIMI
    Şekil 2. Arama sonuçları
  6. Kullanılabilir şablonlar listesinde bakın ve ilgilendiğiniz birini seçin
    Sonuç olarak, hangi üzerinde birden fazla şablon indirme bağlantısını bulabilirsiniz, seçilen şablonun indirme sayfasına yönlendirilirsiniz. Oracle Database 10 g Release 2 ve Oracle Database 11 g Release 1 için diğeri: Örneğin, bu yazının yazıldığı anda, x86_64 için Oracle Veritabanı Medya Paketi (64 bit) sayfası için Oracle VM şablonları iki şablonları sunuyor.
    Ayrıca, indirme sayfasında, şablonu eşlik beni oku dosyasını bulabilirsiniz. Aşağıdaki öğrenmek için dikkatle okuyun:
    • Şablon nedir yazılım bileşenleri içerir
    • Varsayılan yapılandırma
    • Dahil disk görüntüleri parametreleri
    • Dağıtım bilgileri

Oracle VM Template İthalat

Sisteminize şablon arşiv indirdikten sonra, bu FTP, HTTP, HTTPS veya aracılığıyla satışa sunulacak bir dizine taşıyın. (Oracle VM Yöneticisi kullanılan şablon ithal mekanizması sadece bu protokoller ile sınırlıdır.)
Aşağıdaki adımlar Oracle VM Yöneticisi aracılığıyla Oracle VM ortama bir şablon alabilirsiniz nasıl açıklar:
  1. Oracle VM Yöneticisi'nde, Ev görünümüne geçmek.
  2. Navigator, Sunucu Havuzları düğümünü seçin.
  3. Yönetim bölmesinde, Şablonlar sekmesine geçin.
  4. Şablonlar sekmesinin araçları panelinde, Şablon Al simgesini tıklatın.
  5. Şablon Al iletişim kutusunda, Deposu alanında (önceki bölümde açıklandığı gibi oluşturulan) depo belirttiğiniz Sunucusu alanına Oracle VM sunucu belirtin ve Şablon URL'leri alanında şablon arşiv URL'sini belirtin kullanarak FTP, HTTP, HTTPS veya.
Ithal işlemi başında başarısız olursa, kontrol etmek için ilk şey güvenlik duvarıdır. Özellikle, Oracle VM Yöneticisi (güvenlik duvarı varsayılan olarak Oracle VM Server devre dışı) çalışan ana bilgisayarda güvenlik duvarı devre dışı bırakmanız gerekebilir.
Ithal sırasında, şablon arşiv belirtilen depodaki indirilen ve daha sonra açmak olacak. Oracle VM Yöneticisi içeriği sekmelerde yapılan değişiklikleri yansıtmak böylece daha sonra depo otomatik olarak yenilenir. Şekil 3, Oracle VM Yöneticisi penceresi ithal işlemi başarıyla tamamlandıktan sonra neye benzeyeceğini göstermektedir.
ORACLE KULLANIMI
Şekil 3,. Şablonları Sekme bir Oracle VM Çevre bir Şablon alma sonra
Şablonun yapılandırma ve ağ ve depolama bilgileri görüntülemek için, Şablonlar tablodaki şablonu seçin ve ardından uygun sekmesini tıklatın.

Oracle VM Şablon Bir Sanal Makine Oluşturma

Başarılı bir şekilde Oracle VM ortama bir şablon ithal sonra, ondan bir sanal makine oluşturmak isteyebilirsiniz. Bunu için önce olsa da, Oracle VM Yöneticisi bazı ağ görevleri gerçekleştirmek gerekir. Özellikle, bir sanal makine ağ oluşturmak ve ağ kartları gibi sanal makinelere atanacak Sanal Ağ Arayüz Kartları (VNICs) bir dizi oluşturmak gerekir.
Bir sanal makine ağ oluşturmak için, aşağıdaki adımları izleyin:
  1. Oracle VM Yöneticisi, Donanım görünümüne geçmek.
  2. Gezgininde, Donanım sekmesini tıklayın ve Kaynakları klasörü seçin.
  3. Yönetim bölmesinde,  sekmesini seçin.
  4. Ağ sekmesinin araçları panelinde, Ağ Yapılandırma sihirbazı çağırmak için Oluştur Yeni Ağ simgesini tıklatın.
  5. Sihirbazın ilk ekranında, bir ağ yapılandırma seçeneği seçin.
    Tek bir Oracle VM Sunucu varsa, tek bir sunucu seçeneği mantıksal bir ağ oluşturma seçebilirsiniz. Bu durumda, sihirbaz yalnızca iki ekran sunacak.
  6. Oluştur Ağ ekranında, ağ oluşturulmuş ve isteğe bağlı olarak bir açıklama sağlamak olduğu için bir ad belirtin.
  7. Sunucu Seç ekranında, Oracle VM Sunucu Sunucu alanında belirtilen olduğundan emin olun ve sonra sihirbazın kalan adımları tamamlayın.
  8. Bir sonraki adım VNICs bir dizi (en az bir, tek bir sanal makine oluşturmak için planlıyorsanız) oluşturmak için:
    1. Oracle VM Yöneticisi, Araçlar menüsünden vNIC Yöneticisi 'ni seçin.
    2. Sanal Ağ Arayüz Kartı Yöneticisi iletişim kutusunda, bir sonraki MAC adresini elde etmek için İleri'yi tıklatın ve sonra Oluştur 'ı tıklatın.
  9. Şimdi bir sanal makine oluşturabilirsiniz. Bunu yapmak için, aşağıdaki gibi şablonu klonlamak gerekir:
    1. Ana Sayfa görünümüne taşıyın.
    2. Navigator, Sunucu Havuzları klasörü seçin.
    3. Yönetim bölmesinde, Şablonlar sekmesini tıklatın.
    4. Şablonlar tabloda, klonlamak istediğiniz şablonu seçin.
    5. Şablonlar sekmesinin araçları panelinde, Clone simgesini tıklatın.
    6. Clone Sanal Makine Şablon iletişim kutusu (Şekil 4) olarak, klon tipi için basit Clone seçin ve hedef klon türü için Sanal Makineseçin. Ayrıca, sanal makine oluşturulan için bir ad girin. 

      ORACLE KULLANIMI
      Şekil 4. Sanal Makine Şablon iletişim kutusu Clone
      Yukarıdaki adımları sonucunda, bir sanal makine oluşturulur ve bir durdurulmuş durumda sunucu havuzuna konuşlandırdı.
  10. VM çalıştırmak için şu adımları izleyin:
    1. Ana Sayfa görünümüne taşıyın.
    2. Your_vm_server düğüm - Navigator, Sunucu Havuzları-> your_server_pool genişletin.
    3. Sanal makine sağ tıklatın ve açılan menüden Başlat seçeneğini belirleyin.
  11. Sanal makine çalışırken Şimdi, size VM erişebilmesi için Sanal Makine Console, Oracle VM Yöneticisi mevcut bir araç, yüklemeniz gerekir. Eğer Sanal Makine Konsol yararlanabilirsiniz önce, bilgisayar hosting Oracle VM Yöneticisi bir VNC görüntüleyici yüklemeniz gerekir. Bu görüntüleyici, örneğin, olan son paket elde edilebilir Sıkı olabilir, http://oss.oracle.com/oraclevm/manager/RPMS/
  12. Sonraki, indir Java ve Oracle VM Yöneticisi bağlanıyorsanız hangi bilgisayarınıza yüklemek.
  13. Şimdi aşağıdaki gibi Virtual Machine Console başlatabilirsiniz:
    1. Your_vm_server düğüm - Ana bakış Gezinti bölmesinde, Havuz-> your_server_pool Sunucu genişletin.
    2. Sanal makine simgesine sağ tıklayın ve açılan menüden Başlat Konsol seçin.
    3. İstendiğinde, Oracle VM Yöneticisi oturum açma kimlik bilgilerini girin.
    Sonuç olarak, sanal makine konsolu sanal makinenin yükleme sürecinin bir sonucu görünmelidir. Ilk yük üzerinde, sanal makine yapılandırmak için birkaç soru sorulacaktır. Özellikle, DHCP üzerinden sanal makine için bir IP adresi almak veya statik bir IP adresi kullanmak için gidiyoruz olmadığını sorulacaktır.
    • Eğer statik bir IP adresi kullanmayı seçerseniz, bu tür bir IP adresi, ağ maskesi ve ağ geçidi olarak biraz daha bilgi, girmeniz istenir.
    • DHCP kullanmak istiyorsanız, size Oracle VM ortamında çalışan DHCP sunucusu gerekir.
    Şekil 5 konsol bu aşamada nasıl görünebileceğini göstermektedir:
    ORACLE KULLANIMI
    Şekil 5,. Sanal Makine İlk Çalışma sırasında Sanal Makine Konsolu
Önceden yüklenmiş uygulamalar da bir sanal makine ilk yükleme sırasında bazı yapılandırma gerektirebilir. Örneğin, ilk önceden yüklenmiş Oracle Veritabanı ile bir sanal makine yüklerken, Oracle Net dinleyici için TCP / IP bağlantı noktası yanı sıra sistem hesapları ve ilk ayarlamak için gerekli olan diğer şeyler için şifrenizi girmeniz istenir veritabanı yapılandırma parametreleri. Ayrıca açılışta başlatılacak veritabanı istediğiniz sorulur.
Bu ilk yapılandırma sonra, konuk işletim sisteminde oturum istenir. Sen gibi giriş yapabilirsiniz root şifrenizi kullanarak ovsroot (tüm Oracle VM şablonları için geçerli olan). Bir şablon bir Oracle veritabanı varsa, bizim örnekte olduğu gibi, veritabanı hesabı kullanabilirsiniz oracle şifre ile oracle veritabanına bağlanmak için.

Sanal Makineden Yeni Bir Şablon Oluşturma

Muhtemelen farkında olarak, önceki bölümde değindi klonlama mekanizması tek bir şablondan bir sanal makine oluşturmak için sınırlı değildir. Aslında, klonlama da mevcut olanlardan yeni şablonları oluşturabilir ve hatta mevcut sanal makineleri yeni şablonlar ve sanal makineleri oluşturmanıza olanak sağlar.
Örneğimize geri dönersek, en yeni bir şablon oluşturmak için önceki bölümde bir şablondan oluşturulan sanal makine klon sağlar.Burada akıl kullanıma hazır bu sanal makineleri almak için gereken süreyi kısaltabilir ilk yapılandırma, gerektirmeyen sanal makine oluşturmak için kullanılabilecek bir şablon oluşturmaktır. Gerekirse bu yaklaşım, bazı parametreler tabii ki, daha sonra yapılandırılmış olabilir.
Aşağıdaki adımlar bir sanal makineden yeni bir şablon oluşturmak nasıl açıklar:
  1. Your_vm_server düğüm - Ana bakış Gezinti bölmesinde, Havuz-> your_server_pool Sunucu genişletin.
  2. Sanal makine çalışıyorsa, simgesini sağ tıklatın ve açılan menüden Durdur seçin. Aksi takdirde, bir sonraki adıma geçin.
  3. Sanal makine simgesine sağ tıklayın ve açılan menüden Clone seçin.
  4. Clone Sanal Makine Şablon iletişim kutusunda, klon türü alanı için basit Clone seçin ve hedef klon türü için Şablon seçin. Daha sonra, şablon oluşturulmaktadır için bir ad girin.
Bir klon bir durdu sanal makineden oluşturulduğu için önceki adımlarda,, soğuk bir klon olarak bilinen bir klon işlemi. Alternatif olarak, çalışan sanal makine ile ilgili bir sıcak klonu gerçekleştirebilir. Olsa, uyardı: Sıcak klonu sadece bir fotoğraf veya bir yedek kopya olarak kullanıma uygundur tutarsız disk durumu, bir klon üretir.
Yukarıdaki adımları tamamladıktan sonra, size ilk yapılandırma gerektirmeyen sanal makine oluşturmak için kullanabileceğiniz yeni bir şablon olmalıdır. Ancak, büyük olasılıkla yeni bir sanal makine bu şablondan oluşturulduğunda değiştirmek isteyeceksiniz en az iki parametre vardır:
  • Ana bilgisayar adı
  • IP adresi, eğer statik bir IP adresi kullanmayı seçti
Ağınızda aynı ana bilgisayar adını ve IP adresini paylaşan daha fazla sanal makine daha sahip olmak istiyorsanız sürece, bunu yapmak makul görünüyor.
Eğer sanal makine ilk başlangıcında bu parametreleri değiştirmek istiyorsanız, aşağıdaki adımları gerçekleştirin:
  1. Sanal makinenin konsolu aracılığıyla, gibi misafir oturum root (şifrenizi kullanarak ovsroot ).
  2. Kullanın vi yeni değerleri için aşağıdaki yapılandırma dosyaları, IP adresi değişen ve ana bilgisayar adını düzenlemek için metin editörü:
    • /etc/sysconfig/network
    • /etc/hosts
    • /etc/sysconfig/network-scripts/ifcfg-eth0
  3. Sanal makine durdurun ve sonra değişikliklerin etkili olması için yeniden başlatın.
Tahmin edebileceğiniz gibi, burada tartışılan örnekte oldukça düşüktür. O kimse bir sanal makine ilk açılışta bazı sorulara cevap yerine el ile yapılandırma yapmak seçsin inanmak zor. Bir sanal makine bir şablon oluşturmak için bir ihtiyaç var Ancak, bazı durumlarda olabilir. Örneğin, bir Oracle veritabanı çalıştıran bir sanal makine bazı nesneler (tablolar, görünümler, dizinler, ve saklı yordamlar gibi) oluşturduktan sonra, bu sanal makineden bir şablon oluşturmak isteyebilirsiniz.

Şablon yeniden yapılandırılması

Şimdiye kadar, bu klonlandı hangi madde ile aynı yapılandırma ile oluşturulan basit bir klonu baktım. Uygulamada, olsa da, farklı yapılandırma ve dağıtım seçenekleri ile bir klon oluşturmak gerekebilir. Eğer gelişmiş klon seçeneği yararlanabilirsiniz yerdir.
Bir şablon gelişmiş bir klonlama gerçekleştirmek için, bu şablonu için klon çalışma çağırmak ve sonra klon türü için Gelişmiş Clone seçin. Daha sonra, sihirbaz şablonu yeniden yapılandırma sürecinde size yol gösterecektir.
Ayrıca, bu nedenle üzerindeki ağ ayarları, bellek miktarı, sanal işlemci sayısı, ve değişen, bir şablon düzenleyebilirsiniz.
Düzen Şablon Sihirbazı çağırmak için şu adımları izleyin:
  1. Ana Sayfa görünümüne taşıyın.
  2. Gezinti bölmesinde, Sunucu Havuzları klasörü seçin.
  3. Yönetim bölmesinde, Şablonlar sekmesini tıklatın.
  4. Şablonlar tablosunda, düzenlemek istediğiniz şablonu seçin.
  5. Şablonlar sekmesinin araçları panelinde, Şablonu Düzenle simgesini tıklatın.
    Şablonu Düzenle Sihirbazın ilk ekranı Şekil 6'da gösterilmiştir.
    ORACLE KULLANIMI
    6 Şekil. Düzen Şablon Sihirbazı İlk Ekran
Eğer sihirbazın adımlarını tamamladığınızda, yapılandırma ilk yapılandırmasından farklı bir şablon olmalıdır.

Sonuç

Bu makalede öğrendiğimiz gibi, Oracle VM Şablonları kolay sen kalk ve hızlı çalışan için yapım, bir Oracle VM çevreye Oracle teknolojileri dağıtmak için iyi bir yol sağlar.
Bu makalede eylem Oracle VM Şablonları teknoloji basit bir örnek tarif. Oracle Linux üzerinde çalışan Oracle Veritabanı içeren şablonu bir Oracle VM ortama indirilen ve daha sonra ithal edildi. Daha sonra, makalede, yeni bir sanal makine veya farklı bir yapılandırma ile yeni bir şablon oluşturmak için şablon clone nasıl tarif edildi.

26 Haziran 2013 Çarşamba

ORACLE SQL KOMUTLARI

ORACLE SQL KOMUTLARI


Bugün ki yazımızda size Oracle Sql Komutları hakkında kısa bir kaç bilgi vereceğiz.



ORACLE SQL KOMUTLARI


Veritabanı üzerinde yapılacak tüm işlemlerde SQL komutları kullanılacaktır. Yapılacak işlemlere örnek olarak ; veritabanında obje yaratılması, bu objelerin kullanılması, veritabanındaki tablolarında bulunan verilerin yaratılması, değiştirilmesi, silinmesi, sorgulamaların yapılması, veritabanına, tablolara erişim, kontrol ve yönetim işlevleri verilebilir. Çeşitleri isimlendirirsek ;
·    DDL (Data Definition Language) - (Veri Tanımlama Dili)
·    DML (Data Manipulation Language) - (Veri Kullanma Dili)
·    DQL (Data Query Language) - (Veri Sorgulama Dili)
·    DCL (Data Control Language)  - (Veri Kontrol Dili)
·    Data administration commands - (Veri Yönetim Komutları)
·    Transactional control commands - (İşlem Kontrol Komutları)

DDL (Data Definition Language) - (Veri Tanımlama Dili)

CREATE TABLE , ALTER TABLE , DROP TABLE , CREATE INDEX , ALTER INDEX , DROP INDEX ,CREATE VIEW , DROP VIEW gibi Veritabanı objelerinin yaratılmasıyla ilgili komutlardır.

DML (Data Manipulation Language) - (Veri Kullanma Dili)

INSERT , UPDATE , DELETE  gibi en temel komutlarla veritabanı objelerini kullanma işlemleri yapılır.

Bir DML  sadece Parse ve Execute safhalarını içerir.
ORACLE SQL KOMUTLARI
1          Server process, veri ve rollback bloklarını buffer cache’de bulamazsa, bu blokları veri dosyalarından okur.
2          Okunan blokları buffer cache’e kopyalar.
3          Server process veriyi kilitler.
4          Server process, yapılan değişikliği, redo log buffer içindeki rollback (önceki değer) ve veri (yeni değer) kısımlarına kaydeder.
5          Server process, database buffer cache içindeki rollback bloğuna önceki değeri kaydeder ve veri bloğunu da günceller. Buffer cache’teki her iki blok, diskteki ilgili bloklarla aynı değerlere sahip olmadıklarını belirtmesi için, dirty buffers olarak işaretlenir.



Database Buffer Cache: En son kullanılan veri bloklarını saklamak için kullanılır. Her bir buffer'ın büyüklüğü, DB_BLOCK_SIZE parametresi ile belirlenen blok boyutu ile aynıdır. Buffer sayısı DB_BLOCK_BUFFERS ile belirlenir. Oracle server Buffer Cache'de yeni blok alanları temin etmek için Least Recently Used (LRU) algoritmasını kullanır.



DQL (Data Query Language) - (Veri Sorgulama Dili)

SELECT en temel komutudur. Girilmiş olan veriler üzerinde istenilene ulaşmak amacıyla kullanılır.

ORACLE SQL KOMUTLARI1 Parse           Bu bölümde, kullanıcı process'i sorguyu server process'e, yazım kontrolü için bir istek ile gönderir veya sorguyu işler. Server process, komutun geçerliliğini kontrol eder, ve SGA'daki Shared Pool alanını ifadeyi derlemek için kullanır. Bu safhanın sonunda server process user process'e olumlu yada olumsuz bir yanıt gönderir.
2 Execute        Bu safhada server process veriyi almak için hazırlar.
3 Fetch            Sorgu tarafından seçilen satırlar bu safhada server'dan user'a gider. Transfer için kullanılan hafızanın büyüklüğüne bağlı olarak, sorgunun sonucunu kullanıcıya aktarmak için bir yada daha çok fetch (alıp getirme) gereklidir.
Shared Pool    Parse aşamasında kullanılır. SGA'nın bir parçasıdır. İçinde bulunan Library Cache, en son kullanılan SQL ifadeleri ile ilgili bilgileri saklar. Bir ifade yeniden çalıştırılırken, eğer çalıştırma planının üzerine başka ifadelerin çalıştırma planları yazılmadıysa, server process ifadeyi yazım açısından incelemek (parse) zorunda kalmaz. Data Dictionary Cache ise, tablo ve kolon tanımlamaları, kullanıcı isimleri ve şifreler, ve ayrıcalıklar gibi en son kullanılan veri kütüphanesi bilgilerini içerir.

DCL (Data Control Language) - (Veri Kontrol Dili)
ALTER PASSWORD , GRANT , REVOKE , CREATE SYNONYM gibi veritabanındaki objelere erişimlerin yetkilerin kontrol edilmesine yönelik komutları içerir.

Data Administration Commands - (Veri Yönetim Komutları)

START AUDIT , STOP AUDIT  gibi veritabının genel olarak performans analizine yönelik olarak sadece veritabanı yöneticisi tarafından belirli zamanlarda kullanılması gereken komutlardır.

Transactional Control Commands - (İşlem Kontrol Komutları)

COMMIT, ROLLBACK, SAVEPOINT, SET TRANSECTION gibi veritabanındaki tablolara kayıtların kontrol edilmesine yönelik komutlardır.


CREATE TABLE Komutu (CREATE TABLE Statement)

Bir veritabanı içerisinde, kullanıcıların veri girmeleri, değiştirmeleri ve sorgulamaları yapacakları bilgi dosyalarının yaratılması gereklidir. Bu yaratılan tablolara, sistemde yer alan tüm kullanıcılara veya belli kullanıcılara erişim yetkileri verilmelidir. Bu erişim yetkileri, dosyaya kayıt ekleme, silme, değiştirme ve kayıtları seçme yetkilerinden biri olabilir.

Veritabanını oluşturan tabloları yaratan komut CREATE TABLE dir. Bu komutla ; yaratılacak olan tablo ve bu tabloyu oluşturan alanlar, bu alanların tipleri, bu tabloya erişim özellikleri ve bu tablonun diğer tablolarla olan ilişkileri belirlenecektir.

CREATE TABLE tablo_adı (
      Alan_adı    veritipi,
      Alan_adı    veritipi,
      Alan_adı    veritipi,
      ...
      Alan_adı    veritipi,
      CONSTRAINT adı PRIMARY KEY (alanadı,alanadi...),
      CONSTRAINT adı FOREIGNKEY alanadi REFERENCES tablo_adi (alan_adi)
)
TABLESPACE tablespace_adi
STORAGE
(INITIAL          değer
 NEXT             değer
 MINEXTENTS       değer
 MAXETTENTS       değer
 PCTINCREASE      değer);

TABLO_ADI : Kullanılacak amaca uygun olarak, anlaşılabilir, türkçe karakterler ve özel karakterler içermeyen bir isim olmalıdır. 
ALAN_ADI : Tablo içersinde çeşitli tipteki verilerin saklanacağı alanlara verilen isimlerdir. Burada da kullanım amacına uygun, anlaşılır ve türkçe ve özel karakterler içermeyen bir isim olmalıdır. 

Kullanıcıların bu isimleri verirken daha önce dikkatini çekmeye çalıştığım özelliklere uymalarını bir kez daha hatırlatıyorum. Tablo adına bakıldığında bu tablonun ne için yaratıldığı, hangi özellikte olduğu anlaşılmalı aynı şekilde tablo içindeki alanlara verilecek olan isimlerinde barındıracağı bilgiyi açıklayıcı şekilde olmasına dikkat edilmelidir. İleri zamanlarda bu tabloya ve alan isimlerine bakıldığında hem yaratıcı hem de diğer kişilerin kolaylıkla anlamaları açısından belirli kurallara uyulması tavsiye edilmektedir. Proje bazında kullanılacak bu tablolara proje bölüm (STK, FIN, MUH vb.) takılarının eklenmesi, tablonun hangi tipte olduğunun (Parametre, Master vb.) belirtilmesi standartlarına uyulmasına dikkat ediniz.

VERİTİPİ          : Alanların hangi tipte veriyi hangi uzunlukta barındıracağının belirlenmesidir. Veritipleri içinde en çok kullanılanlar ; CHAR, VARCHAR2, NUMBER, DATE, şeklindedir.
           
PRIMARY KEY   : Tablo içindeki kayıtlara hızlı erişimlerde kullanılacak bir veya birden fazla alanların tanımlanması için kullanılır. En önemli özelliği bu alanlara girilecek değerlerin boş olmaması ve tekrar etmiyor olmasıdır. Bir tablo, sadece bir tek PRIMARY KEY özelliğine sahiptir. Tablolar arasındaki ilişkilendirmelerde kullanılmaktadır.

FOREIGN KEY   : Bir tablo içinde belirtilen alanların başka tablolarla bağlantısının sağlandığı ifade şeklidir. Bu özellik sayesinde belirtilen alana girilecek değer, gösterilmiş olan diğer tabloda ki alana önceden girilmiş değerler arasından olmak zorundadır. Böylece verilerin güvenilirliği, doğruluğu sağlanmış olacaktır.

PRIMARY KEY ve FOREIGN KEY ile ilgili detay bilgiler ileriki sayfalarda örnekler ve açıklamaları ile verilmektedir.

TABLESPACE     : Bu tablonun hangi tablespace üzerinde yaratılacağının belirlenmesi için kullanılır. Veritabanın kurulması sırasında kullanıcı tablolarının hangi tablespace üzerinde tutulacağı belirlenmiş olduğundan bu alan isminin kullanılması zorunludur. USER_DATA isminde bir tablespace tanımlaması yapılmışsa burada TABLESPACE user_data şeklinde kullanılmalıdır.

STOREGE bölümü altında ; bu yaratılan tablonun boyutunun, genişleme şartlarının ve bu tabloya erişim büyüklüklerinin değerleri tanımlanır.

(INITIAL          değer
 NEXT             değer
 MINEXTENTS       değer
 MAXETTENTS       değer
 PCTINCREASE      değer);


ALTER TABLE Komutu (ALTER TABLE Statement)

Tablo yaratıldıktan sonra unutulan bir alan veya bir bağlantı şekli veya kullanılan alanların uzunluklarının değiştirilmesi gibi özelliklerin sonrada ilave edilmesi için kullanılan komuttur. Genel olarak ALTER TABLE komutu ile yapılabilecek özellikler ;

Ø  Alan eklenmesi,
Ø  Tabloya ait erişim bilgilerinin eklenmesi,
Ø  Alanların değiştirilmesi (veritipi, boyutu, default değeri),
Ø  Tablonun yaratılması sırasında kullanılan parametrelerin değiştirilmesi,
Ø  Tablonun kullanılmasına yönelik değerlerin değiştirilmesi,
Ø  Tabloya ait yaratılmış erişim bilgilerinin silinmesi,

ALTER TABLE tablo_adi
ADD (alan_adi           veri_tipi,
     alan_adi           veri_tipi)

ALTER TABLE tablo_adi
MODIFY(alan_adi         veri_tipi,
       alan_adi         veri_tipi)

ADD özelliği ile tabloya yeni bir alan ilave edilmiş olacaktır.
MODIFY özelliği ile tabloda var olan bir alanın veritipi veya uzunluğu değiştirilebilir. Ancak bu özelliğin geçerli olabilmesi için tablonun boş yani hiçbir kaydın girilmemiş olması gerekir.


ALTER TABLE stok_model_tanim
 ADD ( CONSTRAINT stok_model_uk1  UNIQUE (TANIM));

Yukarıda ki örnekte stok_model_tanim dosyasına TANIM alanının UNIQUE özelliği eklenmiştir.


ALTER TABLE stok_model_tanim DROP CONSTRAINT stok_model_uk1 ;

Burada da , stok_model_tanim dosyasında yaratılmış olan stok_model_uk1 özelliği silinmektedir.

DROP TABLE Komutu (DROP TABLE Statement)

Yaratılmış olan bir tablonun silinmesi, ortadan kaldırılması amacıyla kullanılır. Tablonun yaratıldığı TABLESPACE’den kaldırılmış olacaktır.

DROP TABLE tablo_adi CASCADE CONSTRAINTS ;

Tablo içindeki bütün kayıtlarda silinmiş olacaktır bu komutun kullanılması sonrasında.

CASCADE CONSTRAINTS özelliğini kullanılmasının amacı ;
Ø  Eğer silinecek tablo bir başka dosyaya FOREIGN KEY ile bağlanmışsa bu özelliği dikkate almadam tabloyu ortadan kaldıracaktır.
Ø  Tablo üzerinde kurulmuş olan PRIMARY KEY veya UNIQUE KEY indexleri de silinecektir.

Ancak kullanıcıların bir tabloyu ortadan kaldırmak istediklerinde dikkat etmeleri gereken noktalar ;

Ø  Ortadan kaldırılan tablonun kurtarılma şansı yoktur (backup hariç)
Ø  Bu tablonun kullanıldığı VIEW, STROGE PROCEDURE, FUNCTION veya TRIGGER’lar geçersiz hale geleceğinden bunların tekrardan kontrol edilerek düzenlenmesi gerekecektir.

KISITLAMALAR (CONSTRAINTS)

Yaratılmış olan veritabanında ki tablolara geçerli ve iş kurallarına uygun şekilde verilerin girilmesi için tablo bazında, alanlar bazında veya ilgili tablolar arasında bazı kurallar konulabilir. Bu kurallar aynı zamanda kısıtlamalar şeklinde olabilir. İşte tüm bu özelliklere KISITLAMALAR (CONSTRAINTS) adı verilir.

Tablolara verilen bu kısıtlamalar veritabanı bazında çalışacağından tabloların alanlarına yeni kayıt girişinde veya güncelleştirmede veya silinme durumlarında devreye girecektir. Kullanıcıların yapmış oldukları programlardan bağımsız olarak çalışacağından herhangi bir atlama, unutma durumlarında yanlış, geçersiz işlemlerin yapılmasına engel olunacaktır.

Tablo ve alanlara kısıtlamaların getirilmesi veritabanın kurulması veya daha sonrasında olacaktır. Ancak bu kısıtlamaların neler olacağı önceden iş kurallarına bağlı olarak belirlenmeli ve denenmelidir. Bu tablolara ve alanlara ileride ne gibi bilgilerin girileceği ön görülerek kuralların koyulması önerilir.

Veritabanı bazında kısıtlamaların konulması bu kısıtlamaları tablo ve alanlarda kolayca izlenmesini görülmesine pek olanak sağlamaz. Veritabanında saklanan bu kısıtlamaları ancak veritabanı sistem yöneticisi (DBA) görebilir bu yüzden özelikle programların yazılması sırasında bu kısıtlamaların neler olduğunun önceden bilinmesi gereklidir. Aksi takdirde bilgi girişlerinde kısıtlamalara takılacak işlemler nedeniyle program hata verecektir. Bu da kullanıcının işlerinin aksamasına neden olur.

Kısıtlama çeşitleri aşağıdaki gibidir (Burada terimlerin türkçe karşılıkları verilmekle beraber daha kolay anlaşılması için orijinal isimleri kullanılmıştır);

Ø  Primary Key                 (Öncelikli Anahtar)
Ø  Foreign Key                  (Dış Anahtar)
Ø  Unique Key                   (Tek anahtar)
Ø  Column Constraint         (Alan bazında kısıtlama)

Primary Key

Bir tabloya hızlı erişimde kullanılacak olan anahtar alanın veya alanların birlikte tanımlanmasıdır. Bu alan veya alanların içindeki değerler tekrar etmeyecek şekildedir. Bir anlamda tekdirler (UNIQUE).

Bir tablonun ancak ve ancak bir PRIMARY KEY olabilir.  Ancak bir tablonun birden fazla UNIQUE KEY olabilir.

Primary key oluşturan alan veya alanlar boş (NULL) olamazlar. Tablonun yaratılması sırasında CREATE TABLE veya yaratıldıktan sonra ALTER TABLE ... CONSTRAINT komutlarıyla tabloya Primary key yaratılabilir.
Primary Key en fazla 16 alanın birleşmesinden oluşabilir. Ancak LONG veya LONG ROW veritiplerini içeren alanlar primary key’de kullanılamaz. Ayrıca bu erişim anahtarının toplam boyutu byte cinsinden veritabanı blok boyutunun yarısından daha az olmalıdır.

Tabloya bir primary key tanımlaması verilmişse sistem otomatik olarak bir unique key de yaratacaktır. Eğer isim verilmemişse bu sistemde SYS_Cn (n tamsayı) tanımlamasıyla yer alacaktır. Primary key veya Unique key isimlendirilmesinde de kolayca anlaşılabilir terimlerin kullanılmasına dikkat edilmelidir. Bir alan primary key olarak tanımlanacaksa NOT NULL ifadesini kullanmak gereksizdir. Çünkü bir alan primary key olarak tanımlanacaksa boş değer alamaz.

CREATE TABLE elemanlar (
      eleman_no   number(3) CONSTRAINT pk_satis PRIMARY KEY,
      adi         varchar2(15),
      soyadi      varchar2(10)
);

örneğinde olduğu gibi tablonun yaratılması sırasında alanların belirlendiği sırada tanımlama yapılabilir. Ya da

CREATE TABLE elemanlar (
      eleman_no   number(3),
      adi         varchar2(15),
      soyadi      varchar2(10),
      CONSTRAINT pk_satis PRIMARY KEY (eleman_no)
);

örneğinde olduğu gibi tablonun yaratılma komutunun en son satırında hangi alanın primary key olacağının belirtilmesi ile de yaratılabilir. Eğer tablonun yaratılmasından sonra bu tabloya primary key eklenmek istenirse ;

ALTER TABLE elemanlar ADD PRIMARY KEY (eleman_no) ;

Foreign Key

İş süreçlerine uygun şekilde tasarlanmış veritabanlarına ait tablolara giriş, düzeltme veya iptal işlemlerinde bilgilerin sürekliliği, doğruluğunun kontrol altında tutulabilmesi mutlak şarttır. Tablolara ait alanlara giriş yapılırken başka tablolarda ki alanlar kullanılabilir. Parametre tablolarına girilen değerler, master tablolarda kullanılabilir. Aynı şekilde master tablolarda kullanılan değerler detay tablolarda da aynı şekilde kullanılması gereklidir. Verinin tutarlı olması açısından son derece önemli olan bu özelliği kullanmak için Foreign Key (Yabancı tablolara erişim) yararlanalır.

Bir tabloya ait bir alan (child-sonuç), başka bir tablonun alanı (parent-esas) ile arasında Foreign Key ilişkisi kurulmuşsa artık sonuç alanına, bağlandığı tablonun esas alanındaki değerlerden başka bir değer girilmesi engellenmiş olacaktır. Aynı şekilde esas tablo alanındaki değerlerin değiştirilmesi veya silinmesi de veritabanı seviyesinde engellenmiş olacaktır. Bu kısıtlama yönteminin kullanılması ile uygulama programlarında bu kontrollerin yapılması gereksiz olacaktır.

Bir tablo içinde Foreign key kullanılması için bazı kurallara dikkat edilmesi gereklidir ;

Ø  Esas tablo alanın Primary Key olarak tanımlanmış olması,
Ø  Esas tablonun sonuç tablosundan önce yaratılması (CREATE TABLE) ,
Ø  Bağlanacak alanların aynı veri tiplerinde olması,

Örneğin bir okula ait BOLUMLER tablosu (Parent), parametre tablosu olarak tanımlanmış olsun. Öğrencilerin hangi bölüme ait olduklarıda OGRENCI tablosunda bir alanda (Child) tutulacaktır. Bu OGRENCI tablosu MASTER tablo niteliğindedir.

CREATE TABLE bolumler (
      bolum_no    number(3),
      adi         varchar2(15),
CONSTRAINT pk_bolum PRIMARY KEY
);

CREATE TABLE ogrenci (
      Ogrenci_no  varchar2(10),
      Adi         varchar2(15),
      Soyadi      varchar2(15),
Ogr_bolum   number(3),
CONSTRAINT fk_bolum FOREIGN KEY (ogr_bolum) REFERENCES bolumler (bolum_no)
);

Bu şekilde tanımlanmakta olan OGRENCI tablosunda ki ogr_bolum alanı , BOLUMLER tablosunda ki bolum_no alanı ile Foreign key kullanılarak bağlanmıştır. Böylece ogr_bolum alanına, bolum_no alanındaki değerlerden başka bir değer girilmesi mümkün değildir. Aynı şekilde bolum_no alanına girilmiş bir değer eğer ogr_bolum alanında kullanılmışsa artık bu değer değiştirilemez ve silinemez. Ancak child tablosunda kullanılması ortadan kaldırıldığında bu değer silinebilir veya değiştirilebilir.

Unique Key

Bir tablodaki bir alanın değerlerinin tekrar etmemesi için kullanılan bir kısıtlama yöntemidir. Ancak bu alanın değeri NULL olabilir. Bir tablodaki PRIMARY KEY olarak tanımlanmış alanlara UNIQUE KEY kullanılması gereksizdir zaten unique özelliğini taşımaktadır. Bir tabloda yer alan alanların arasında en fazla 16 alanın birleşmesinden unique key yaratılabilir. Ancak LONG ve LONG RAW tipli alanlarda Unique key kullanılamaz.

CREATE TABLE bolumler (
      bolum_no    number(3),
adi         varchar2(15) CONSTRAINT uq_adi UNIQUE KEY
);

örneğinde adi alanına girilecek olan değerlerin aynı olmaması sağlanmış olacaktır. Böylece aynı bölüm isimlerinin tabloya girilmesi engellenecektir.

Column Constraint

Bir tablodaki bir alanın değerinin kontrol edilmesi amacıyla bu kısıtlama yöntemi kullanılır. İş süreçlerine uygun şekilde alanlara değerlerin girilmesinin veritabanı seviyesinde kontrol altında tutularak yanlışlıklara engel olunması sağlanmış olacaktır. Tablodaki alana uygulanacak bu kısıtlama yöntemi ancak birtanedir ve bazı kuralları vardır.

Ø  Diğer kayıtlardaki değerlerin sorgulanarak sonuçlanması yapılamaz,
Ø  SYSDATE, UID (UserID), USER ve USERENV gibi fonksiyonlar kısıtlamalarda kullanılamaz,
Ø  CURRVAL, NEXTVAL, LEVEL, ROWID gibi alanlar kullanılamaz,
Ø  Bir alanda sadece bir kısıtlama kullanılabilir

CREATE TABLE bolumler (
        Bolum_no       number(3) CONSTRAINT check_bolumno 
                                 CHECK (bolumno BETWEEN 100 AND 999), 
        Adi            varchar2(15) CONSTRAINT check_adi
                                    CHECK (adi = UPPER(adi)) 
);

Yukarıdaki örnekte “bolum_no” alanına 100 ile 999 arasında bir sayı girilmesi sağlanmış olacaktır. Ayrıca “adi” alanına girilen değeri saklarken büyük harfe çevrilecektir.

Uygulama programlarında bu kısıtlamalar haricinde değerler girilirse sistem hata mesajı verecektir ve kullanıcıların bu mesajları anlayabilmesi için programlarda bu hata mesajların kontrol edilmesi sağlanmalıdır.

DROP CONSTRAINT Komutu (DROP CONSTRAINT Statement)

Bir tablo üzerinde oluşturulmuş alan veya tablo bazlı kısıtlamaların ortadan kaldırılması için kullanılır. Ancak kullanıcıların bu komutu kullanmadan önce tablolar arasındaki bağlantıların, alanlara girilecek değerlerin kontrolünün olmayacağını unutmamalıdırlar. Özellikle çalışan veritabanlarında bu komutun kullanılmaması tavsiye edilir.

Bir tablo üzerindeki bir kısıtlamanın kaldırılmasına örnek verilmek istenirse ;

DROP  <tablo_ismi> CONSTRAINT <kısıtlama_adi>


CREATE INDEX Komutu (CREATE INDEX Statement)

Veritabanında yaratılacak tablolarda tutulacak verilere hızlı erişerek işlem yapılması esastır. Veri girişi, veri güncelleme, silme veya raporlama amaçları için tablolardaki alanlar kullanılarak erişimler yapılmaktadır. Bu erişimlerin hızlı olabilmesi için de alanların istenilen şekilde sıralı olmalıdır.

Indexlerin yaratılması sırasında iyi bir analiz yapılmalıdır. Bir tabloya yapılacak her kayıt ekleme, güncelleme, silme (INSERT, UPDATE, DELETE) işlemlerinde index tablolarının da güncelleneceği unutulmamalıdır. Bu da sistem performansını genel olarak düşürücü bir faktördür. Özellikle veriye erişim yöntemlerinin, raporlamalarda kullanılacak sorgu çeşitlerinin belirlenmesi ve hepsini kapsayacak index tabloların yaratılması önerilir. Ayrı ayrı alanlar için index yaratılacağına bu alanların birlikte kullanılacağı index tabloların yaratılmasına çalışılmalıdır. Ayrıca çalışmakta olan bir veritabanında, içinde yüklü sayıda veri olan tablolara sonradan indexlerin yaratılması sistem performansını etkileyeceği unutulmamalıdır. Ayrıca benzer alanlardan oluşan indexler varsa sorgulamalar sırasında veritabanının hangi indexi kullanacağının belirlenmesi tavsiye edilir.

Veritabanı sisteminde dahan önce gördüğümüz CREATE TABLE komutu sırasında kullandığımız PRIMARY KEY ve UNIQUE değerleri için otomatik olarak INDEX tablolar yaratılır. Böylece veriye erişmede kolaylık, hızlılık sağlanmış olacaktır.

Kullanılacak tüm SELECT ifadelerindeki WHERE kısmında yazılacak alanların INDEX tablolarında kullanılan alanlardan seçilmesi gerekir. Aynı zamanda WHERE kısmının fazla karışık olmaması tavsiye edilir. Böylece sistemin hangi index tablosunu kullanacağının belirlenmesinde zorluk yaşanmamış olur. WHERE kısmında kullanılacak alanların INDEX tablolarındaki sıraya göre yazılmaz ise INDEX kullanılmamış olacaktır. INDEX hangi sıradaki alanlar ile yaratılmışsa WHERE kısmında da o sırada kullanılması gerekmektedir.

ORACLE veritabanı, INDEX yönteminde B*-TREE denilen yöntemi kullanmaktadır. Bu yöntemde indexlenen alanlar bir ağaç yapısı şeklinde disk üzerinde tutulurlar. Indexli bir alana erişmek istenildiğinde aşağıdan yukarıya doğru bir yöntemle uygun ve istenilen verilere ulaşılmış olacaktır. INDEX tablolarında sıralanmış alanları belirleyen aıraç ROWID denilen özelliktir. ROWID her bir alanın kaçıncı kayıt olduğunu gösteren bir sistemdir. UNIQUE olan alanların INDEX değerlerinde tek bir ROWID vardır. NONUNIQUE indexlerde ise önce alanın değeri daha sonra ROWID vardır.

Sorgulamaların çalıştırılmadan önce EXPLAIN denilen yöntemle analiz edilerek doğru indexlerin kullanıp kullanmadığı araştırılmalıdır. Genel kural olarak bir sorgulama sonucunda tablonun toplam kayıt sayısının %10 ila %15’i kadar kayıt getirilecekse index yaratılması uygundur. Eğer bir sorgulama bu oranlardan daha fazla sayıda kayıt getirecekse index kullanılmasının bir yararı olmadığı gibi sistem performansını olumsuz etkileyecektir.

INDEX kullanılmadan bir tabloya erişim yapılmak istenirse, veritabanı sistemi, bu tablonun disk üzerindeki dağıtık şekilde bulunan parçacıklarına erişerek tümü bazında arama yapacaktır. Bu şekilde bir arama TABLE SCAN veya FULL TABLE SCAN olarak adlandırılır. Bu şekildeki arama, disk kafasının sürekli hareketi, sürekli bir şekilde okuma ve kontrol etme, böylece işlemci üzerindeki yükü arttıracaktır. Bütün bunlarda sistemin performansını olumsuz etkileyecektir. Veriye hızlı erişmenin tek yolu doğru bir şekilde INDEX’lenmiş tabloları doğru WHERE ifadelerini SELECT cümlecikleri içinde kullanmaktır.

CREATE [UNIQUE] INDEX <index_ismi>
ON {<tablo_ismi>(<alan1>,...[ASC |DESC])}
[INITRANS   sayi]
[MAXTRANS   sayi]
[TABLESPACE <tablespace_adi>]
[PCTFREE          sayi]
[NOSORT]
[RECOVERABLE | UNRECOVERABLE ]


Ø  UNIQUE        : İndekslenecek alanın tekil olacağını belirten bölümümdür.
Ø  İndex ismi    : Oluşturulacak indekse verilecek isimdir.
Ø  Tablo ismi    : İndeksin tanımlanacağı tablo ismidir.
Ø  Sütun ismi    : İndeksin oluşturulacağı sütunlardır.
Ø  ASC           : İndeksin artan olacağını belirten bölümdür.
Ø  DESC          : İndeksin azalan olacağını belirten böümdür.
Ø  INITRANS      : İndeks üzerinde aynı anda ilk olarak kaç tane işlem yapılacağının belirtildiği bölümdür.
Ø  MAXTRANS      : İndeks üzerinde aynı anda en fazla kaç işlem yapılacağının belirtildiği bölümdür.
Ø  TABLESPACE    : İndeksin hangi  tablespace üzerinde oluşturulacağının belirtildiği bölümdür.
Ø  PCTFREE : Sonradan yapılacak ekleme ve değiştirmeler için boş olarak ayrılacak yerin bloğa göre yüzdesinin belirtildiği kısımdır.
Ø  NOSORT  : Kayıtlar veritabanında sıralı olarak yer alıyorsa, indeks kayıtlarının tekrar sıralanmaması için kullanılan ifadedir.
Ø  RECOVERABLE: İndeks için yapılan işlemlerin geri alma ihtimaline kaydedilmesini belirten bölümdür.
UNRECOVERABLE: İndeks için yapılan işlemlerde geri alma işlemi olmayacağının belirtildiği bölümdür.

CREATE WIEW Komutu (CREATE VIEW Statement)

Bir veritabanında yer alan tablolar ve bu tablolardaki alanların sorgulama yapılarak kullanılması ve çıkan sonuçların bir geçici dosyada (VIEW) tutulması işlemidir. Tablolar arasında bağlantılar kullanılarak sorgulamanın her seferinde yeniden yazılması yerine bir kez yazılarak sonuçların görüntü tablosunda tutulması ve bu tablo üzerinden de sorgulamaların yapılması hız, zaman ve performans kazandıracaktır.

Yaratılmış olan görüntü tablosu üzerinde INSERT, DELETE ve UPDATE işlemleri yapılamaz. Ancak görüntü tablosunu oluşturan tablolara yeni bir kayıt eklenmesi, değiştirilmesi ve silinmesi durumlarında görüntü tablosunda da güncelleştirmeler yapılacaktır.

Görüntü tabloların kullanılması, veritabanında ilgili tabloların üzerinde bağlantıların tekrar tekrar kurulması engellenmiş olacaktır. İş süreçlerine bağlı olarak özellikle ekran veya yazıcı raporların alınması, sorgulamaların gerçekleştirilmesi gibi amaçlarda kullanılır.

CREATE or REPLACE VIEW tablo_adi AS
      SELECT .....;

Bu formata uygun bir şekilde ilk defa yaratılan (CREATE) veya yaratılmış bir görüntü tablosunda değişiklik (REPLACE)  yapmak mümkündür. “tablo_adi” ile oluşturulacak olan görüntü tablosuna bir isim verilecektir. Bu isimin kolayca anlaşılmasına dikkat edilmelidir. Tabloyu oluşturacak sorgulama SELECT ifadesinin içeriğinde yer alacaktır.

Görüntü dosyasının oluşturulması sırasında yeni bir alan kullanılabilir bu takdirde bu alana bir isim verilmesi gereklidir.

Görüntü dosyasının yaratılması sırasında ORDER BY ile sıralama yapılması özelliği kullanılmaz. Buna karşılık GROUP BY özelliği kullanılabilir.

Örnek olarak aşağıdaki BOLUMLER ve OGRENCILER tablolarının “bolum_no” ile bağlanarak ogrenci nin adı ve soyadı ile bölüm adının listeleneceği bir görüntü dosyası oluşturalım.

CREATE TABLE bolumler (
      bolum_no    number(3),
      adi         varchar2(15),
CONSTRAINT pk_bolum PRIMARY KEY
);

CREATE TABLE ogrenci (
      Ogrenci_no  varchar2(10),
      Adi         varchar2(15),
      Soyadi      varchar2(15),
Ogr_bolum   number(3),
CONSTRAINT fk_bolum FOREIGN KEY (ogr_bolum) REFERENCES bolumler (bolum_no)
);

CREATE or REPLACE view_ogr_bolum AS
SELECT a.adi||’ ‘||a.soyadi ISIM, b.adi BOLUM
  FROM ogrenci a, bolumler b
 WHERE a.ogr_bolum = b.bolum_no;

Bu örnekte OGRENCI tablosundaki “adi” ve “soyadi” alanları birleştirilerek “ISIM” alanı olarak, BOLUMLER tablosundaki bolum adi “adi” alanı ise “BOLUM” alanı olarak kullanılmıştır. Yaratılan view_ogr_bolum tablosunda sorgulama yapılmak istenirse,

SELECT *
  FROM view_ogr_bolum
 ORDER BY isim;


DROP VIEW Komutu  (DROP VIEW Statement)

Yaratılmış bir görüntü tablosunun veritabanından silinmesi için kullanılır.

DROP VIEW <tablo_adi>   şeklinde kullanılır. Özellikle yaratılmış ve programlar tarafından kullanılmakta olan bir görüntü tablosunun silinmesi durumunda programların çalışmayacağı unutulmamalıdır.


CREATE SEQUENCE Komutu (CREATE SEQUENCE Statement)

Bir sayaç tablosu olarak isimlendirebileceğimiz “Sequence” tipi tablolar verilen bir sayıdan başlayarak artan veya azalan değerlerde sayı üretilmesi için kullanılır. Özellikle başka tablolarda yer alan ve kullanıcı müdahalesine gerek kalmadan programcılar tarafından sisteme yüklenen numara alma işlemleri için kullanılır.

CREATE SEQUENCE <sayac_tablo_ismi>
[START WITH       sayi]
[INCREMENT BY     sayi]
[MINVALUE          sayi | NOMINVALUE]
[MAXVALUE          sayi | NOMAXVALUE]
[CYCLE | NOCYCLE ]
[CACHE            sayi | NOCACHE]
[ORDER |  NOORDER]
START WITH                Sayacın başlayacağı değerdir.
INCREMENT BY             Sayacın kaçar kaçar artacağını gösteren değerdir.
MINVALUE                    Sayacın alacağı en ufak değeri gösterir.
NOMINVALUE                İlk değer olarak seçilidir. Sayaçların artması durumunda değeri 1, azalması durumunda -        
değerini alır.
MAXVALUE                   Sayacın alacağı en büyük değeri gösterir.
NOMAXVALUE               İlk değer olarak seçilidir. Sayaçların artması durumunda ki değeri azalaması durumunda –1 dir.
CYCLE                           Sayaç almanın ilk veya son değerine ulaştığında tekrardan sayı üretmeye başlayacağını
gösterir.
NOCYCLE                     İlk değer olup, sayaç almanın ilk veya son değerine ulaştığında sayı üretilmesi durur.
CACHE                         Sayaç alınması sırasında kaç sayının bellekte tutulacağını gösterir.
NOCACHE                     Türetilen sayılar bellekte tutulmayacak anlamındadır.
ORDER                         Sayaç tablosunun üreteceği sayılar sıralı olacaktır.
NOORDER                     Sayaç tablosu rastgele sırada sayı üretecektir.

Aşağıdaki örnekte “sayac_al” tablosu 1’den başlayarak her defasında 1 artarak sayı üretecektir.

CREATE SEQUENCE sayac_al
      START WITH 1
      INCREMENT BY 1
      ORDER;

Bu “sayac_al” tablosundan yeni bir sayı alınması için NEXTVAL deyimi kullanılır;

SELECT sayac_al.NEXTVAL FROM dual;

“sayac_al” tablosunun şuanki değerini görmek için CURRVAL deyimi kullanılır;
 
SELECT sayac_al.CURRVAL FROM dual;

Bu tür işlemlerin yapılabilmesi içi DUAL tablosundan yararlanılır.
 

DROP SEQUENCE Komutu (DROP SEQUENCE Statement)

Oluşturulmuş bir sayaç alma tablosunun veritabanından silinmesi, düşürülmesi amacıyla kullanılır.

DROP SEQUENCE <sayac_tablo_ismi>


SELECT Komutu (SELECT Statement)

SELECT ifadesi veri tabanındaki bir veya daha fazla tablodan verileri alır ve sorgu sonucu olarak getirir.

SELECT ifadesinin genel yazılımı aşağıdaki gibidir.

SELECT [ALL | DISTINCT] seçim_listesi (select_list)
[FROM {tablo_adı(table_name)|görüntü_adı(view_name)}                       
      [ipuçları (optimizer_hints)]]
[WHERE cümleciği (WHERE clause)]
[GROUP BY cümleciği (GROUP BY clause)]
[HAVING cümleciği (HAVING clause)]
[ORDER BY cümleciği (ORDER BY clause)]

Yukarıdaki ifadelerde yer alan cümleciklerin açıklamaları :

ALL

Sorgulama sonucunda yer alacak bütün satırları getirir. Tekrarlayan satırları tekrar adedi kadar getirir.

DISTINCT

Sorgulama sonucunda tekrar eden satırları bir kere getirir. Varsayılan değer (default) ALL dur.



seçim_listesi (select_list)

            Tablo(lar)da seçilecek alanların (field) isimlerinin yazıldığı yerdir. Aşağıdakilerden biri veya birkaçı olabilir.

- Asterisk (*), FROM cümleciğinde seçilen tablolardaki kolonların hepsini yaratma sırasına göre getirir.
- Görülmek istenen sıra ile yazılmış kolon isimlerinin listesi. Birden fazla alan adı varsa virgülle ayrılmalıdırlar.
- Alan adı ve alan başlığı ile birlikte yazılması. Alan adı içinde boşluk varsa ' ' arasına yazılmalıdır.
             Örneğin:
       SELECT CREDATE 'YARATMA TARIHI' FROM deneme
- Bir ifade olabilir. Bu ifade alan adı, sabit, fonksiyon, veya alanların çeşitli kombinasyonları veya altsorgu (subquery) olabilir.
- Lokal veya global değişken.
- Birden fazla tablo kullanılıyor ve bu tablolarda aynı alan isimleri varsa tablo adı veya sembolleri ile birlikte yazılır.

FROM {tablo_adı(table_name)|görüntü_adı(view_name)}                   

Bu kısıma verilerin alınacağı tablo(lar) veya görüntülerin adları yazılır.
Seçim listesinde bulunan kolonların ait olduğu tabloların adları FROM ifadesinde bulunmalıdır.
Aksi halde "geçersiz kolon adı" hatası görülür. Birden fazla tablo kullanılıyorsa bunları sembollerle ifade etmekte mümkündür.

SELECT a.credate, a.creuser, b.credate, b.creuser FROM fatura a, fatura_detay b

WHERE cümleciği (WHERE clause)
           
Bu bölümde şeçim yapılacak tablolar arası bağlantılar kurulur (join) ve tabloların çeşitli alanlarına istenen kriterler verilir.

·           Mantıksal kontrol
·           Aralık kontrol (BETWEEN)
·           Sahip olma kontrol (IN)
·           İçinde yer alma kontrolü (LIKE)
·           Boş değer kontrolü (NULL)

Mantıksal Kontrol

=,<>,<,<=,>,>= işaretlerini kullanılarak yapılan karşılaştırmadır.

Eğer karşılaştırma sonucu doğru (true) ise TRUE değeri üretilir.
Eğer karşılaştırma sonucu yanlış (false) ise FALSE değeri üretilir.
Eğer karşılaştırılan alanlardan herhangi biri NULL ise test sonucu NULL değeri üretilir.

Aralık Kontrol (BETWEEN)

Kayıtların verilen aralıkta olup olmadığını kontrol eder. Verilen aralığın sınırları da kontrole dahildir.
Örneğin,
      SELECT * FROM sehirler
      WHERE ilkodu BETWEEN 34 AND 45

Sahip olma kontrol (IN)

Kayıtların verilen bir listede olup olmadığı test edilir.
Örneğin,
   SELECT * FROM sehirler WHERE ilkodu [NOT] IN (34,35,6)

Burada NOT ifadesi ile karşılaştırmanın tersini de yapmak mümkündür. Yukarıdaki cümlecikte kullanılırsa
ilkodu 34,35,6 olmayan iller listelenmiş olacaktır.

IN içinde yer alacak değerler sayısal veya karakter tipinde olabilir.

Benzer kontrolü (LIKE)

Karşılaştırma yapılacak değerin alan içinde yer alıp alınmadığının kontrolüdür.

SELECT * FROM sehirler WHERE iladi LIKE 'A%'
(iladı alanında A ile başlayanlari getirir. Adana, Ankara gibi)

SELECT * FROM sehirler WHERE iladi LIKE '%A%'
(iladı alanında A olanları getirir. Adana, Ankara, Van, Manisa gibi)

SELECT * FROM sehirler WHERE iladi LIKE '_a%'
(iladı alanında ilk karakteri ne olursa olsun ikinci karakteri A olanları getirir. Manisa, Van gibi)

"_" : Kullanıldığı yere göre tek bir karakterin yerini tutar.
"%" : Kullanıldığı yerin gerisinde veya ilerisindeki karakterleri kapsar.

Boş değer kontrolü (IS NULL)

Boş alanların seçimi için kullanılır.

Örneğin;
      SELECT * FROM sehirler  WHERE iladi IS NULL
Sehirler tablosunda iladi girilmemis (boş olan) kayıtlar listelenir.

      SELECT * FROM sehirler  WHERE iladi IS NOT NULL
Sehirler tablosunda iladi girilmis (boş olmayan) kayıtlar listelenir.


İçinde yer alma kontrolü (IN)

Karşılaştırılan alanın değeri verilen ifadelerin içinde olanların seçilmesi için kullanılır.
Örneğin;
      SELECT * FROM sehirler  WHERE iladi IN (‘ISTANBUL, ‘ANKARA)
Sehirler tablosunda iladi ISTANBUL ve ANKARA’ya eşit olanlar kayıtlar listlenir.

      SELECT * FROM sehirler  WHERE iladi NOT IN (‘ISTANBUL, ‘ANKARA)
Sehirler tablosunda iladi ISTANBUL ve ANKARA dışında kalan kayıtlar listelenir.


WHERE cümleciği içinde yer alan bu kontrolleri AND , OR kullanarak birleştirmek mümkündür.


ORDER BY Cümleciği

Sorgulama sırasının belirlendiği ifadedir. Default (temel) değeri ASC olup küçükten büyüğe doğrudur. İfadenin sonunda DESC kullanılırsa büyükten küçüğe doğru sıralama yapılacak anlamındadır.

Örneğin;
      SELECT * FROM sehirler  ORDER BY iladi
Sehirler tablosundaki tüm kayıtlar “iladı” alanı sırasında küçükten büyüğe doğru sıralanır.

      SELECT iladi, ilkodu FROM sehirler ORDER BY 2
Sehirler tablosundaki tüm kayıtlar SELECT cümleciğinde yer alan alan adlarından 2.si olan ilkodu alanına göre küçükten büyüğe doğru sıralanır.

GROUP BY Cümleciği

Bir tabloda yer alan alanların gruplandırılarak istenilen SQL fonksiyonlarının kullanılması içindir.

ORDERNO    LINENO     PARTNO     QUANTITY
---------- ---------- ---------- ----------
      9001          1        101         15
      9001          2        102         10
      9002          1        101         25
      9002          2        103         50
      9003          1        101         15
      9004          1        102         10
      9004          2        103         20

Örneğinde LINEITEMS tablosunda, LINENO alanına göre QUANTITY toplamlarını almak istediğimizde

SELECT lineno, SUM(quantity)
  FROM lineitems
  GROUP BY lineno;

İfadesinin sonucu

LINENO     SUM(QUANTITY)
---------- -------------
1           65
2           80

GROUP BY ifadesinde yer alacak alanlarla SELECT satırında yer alacak alanların aynı sayıda ve sırada olması gereklidir. Eğer SELECT satırında kullanılan bir alan, GROUP BY satırında kullanılmaz ise gruplandırma yapılamayacaktır.

HAVING Cümleciği

GROUP BY ifadesi ile kullanılan fonksiyonun kontrolü yapılmak istenirse HAVING cümleciği kullanılır. SELECT satırında yer alan hesaplama sonucunda bulunan değerin kontrol edilip ondan sonra gösterilmesi içindir. Yukarıda ki örnekte toplamın 70’den büyük olanların gösterilmesi istenirse o zaman ;

SELECT lineno, SUM(quantity)
  FROM lineitems
  GROUP BY lineno
  HAVING SUM(quantity)>70;

İfadesinin sonucu

LINENO     SUM(QUANTITY)
---------- -------------
2           80

böylece SQL ifadesi gruplandırmayı LINENO alanına göre yapar ve bulduğu sonucu HAVING satırında ki değerle kontrol eder, 70’den büyükse ekrana getirir aksi takdirde ekrana getirmeyecektir.

Bir tabloda gruplandırma yapılırken kullanılan alanın veya alanların istenilenler arasından seçilmesi için WHERE cümleciğinin kullanılması gerekir. WHERE, kayıt (record) sırasında seçimler için kullanılır, HAVING ise SQL’ün çalışması sonucu bulunan değerin seçiminde yani sonucun kontrol edilmesinde kullanılır.

SELECT içinde ROWID Kullanılması

SELECT komutunu kullanırken tablonun, içindeki kayıtların giriş şeklinde göre numaralandırılması ve istenilen kayıt sayısı kadar listelenmesi için kullanılan bir özelliktir.

Bu örnekte ogrenci tablosunun ilk 10 kaydı listenelecektir.

SELECT rowid, adi FROM ogrenci WHERE rowid<10


SQL GURUP FONKSİYONLARI

Bir Alanın Toplamını Hesaplama (SUM)

            SUM(kolon_adı) fonksiyonu, bir alandaki verilerin toplamını hesaplar. Kolondaki verilerin hepsi sayısal veri tipinde(data type) (tam sayı(integer), ondalıklı sayı(decimal),devirli sayı(floating point), para(money)) olmalıdırlar.

Bir Kolonun Averajını Hesaplama (AVG)

            AVG(kolon_adı) fonksiyonu, bir kolondaki verilerin averajı(aritmetik ortalaması)nı hesaplar. Kolondaki verilerin hepsi aynı sayısal (numeric) veri tipinde (data type) (tam sayı(integer), ondalıklı sayı(decimal), devirli sayı(floating point),para(money)) olmalıdırlar.

En büyük ve En küçük Değerlerin Bulunması (MIN ve MAX)

            MIN(kolon_adı) ve MAX(kolon_adı) fonksiyonları sırasıyla, bir kolondaki en küçük ve en büyük değeri bulurlar. Kolondaki veriler sayısal (numeric), zaman (date/time), karakter (string) veri tipinde olabilirler. MIN ve MAX fonksiyonlarının sonuçları da kendilerini oluşturan kolondaki verilerle aynı veri tipindedirler.

Verileri Sayma (COUNT)

            COUNT(kolon_adı) fonksiyonu, karşılaştırma değerine uyan kayıtların sayısını verir. Sonuç tam sayıdır. Alanı oluşturan veriler arasında boş (NULL) değerler varsa bunlar sayılmazlar.


CREATE TABLE satis (
      satis_no    varchar2(10),
      tarih       date(15),
      tutar       number(15),
);

Satis_no    Tarih       Tutar
--------    ----------  ---------
10001       01/10/2001  10000000
10002       01/10/2001  15000000
10003       10/10/2001  5000000

SELECT SUM(tutar) “Satış Toplamı”
  FROM satis

Satış Toplamı
-------------
30000000
SELECT MAX(tutar) “En büyük Satış”
  FROM satis

En büyük Satış
--------------
15000000
SELECT MIN(tutar) “En küçük Satış”
  FROM satis

En küçük Satış
--------------
5000000
SELECT AVG(tutar) “Ortalama Satış”
  FROM satis

Ortalama Satış
--------------
10000000
SELECT count(*) “Satış Sayısı”
  FROM satis

Satış Sayısı
------------
3
SELECT tarih,sum(tutar) “Toplam” ,count(*) “Adet”
  FROM satis
GROUP BY tarih

Tarih       Toplam    Adet
----------  --------  ----
01/10/2001  25000000  2
10/10/2001  5000000   1

DUAL TABLOSU

Bazı SQL ifadelerinin kullanılması ve denenmesi için ORACLE veritabanında DUAL isimli bir tablo yer almaktadır.Sistem tarafından yaratılan bu tabloya tüm kullanıcılar erişebilmektedir. DUMMY isimli , VARCHAR2(1) veri tipinden oluşan bir tablodur. Tek bir kayıttan oluşan bu tabloda kullanıcıların SELECT ifadesi içersinde çeşitli özellikleri kullanmalarına olanak tanır.

Bizde aşağıdaki SQL fonksiyonlarını örneklerle anlatmak istediğimizde bu DUAL tablosundan yararlanacağız.

SQL FONKSİYONLARI

Bu bölümde SQL ifadeleri içinde sıkça kullanılan bazı SQL fonksiyonları anlatılacaktır. Kullanılabilecek tüm fonksiyonlar ilgili dökümanlarda bulunacağı unutulmamalıdır. Bu bölüme alınan fonksiyonlar kullanıcıların işine yarabilecekleri fonksiyonlardan seçilmiştir. Ayrıca bazı fonksiyonların en çok kullanılan özellikleri gösterilmektedir.

Karakter Fonksiyonları

CONCATE(karakter1,karakter2,...)

Karakter biçimde verilen değerleri ard arda birleştiren fonksiyondur. || şeklinde de kullanılabilir.

Aşağıdaki örnekte ogrenciler tablosundaki kayıtlar, “adi” ve “soyadi” alanları birleştirilerek listelenecektir.
 
SELECT adi||’ ‘||soyadi ‘Ogrenci’ FROM ogrenciler

LOWER(karakter)

“karakter” içersinde büyük harfle yazılmış ifadeyi küçük harfli haline dönüştürür. 

UPPER(karakter)

“karakter” içersinde küçük harfle yazılmış ifadeyi büyük harfli haline dönüştürür. 

REPLACE(karakter,aranacak_karakter,yerleştirilecek_karakter)

“karakter” içersinde , “aranacak_karakter” ile verilen ifadeyi arar ve bulduklarının yerine “yerleştirilecek_karakter’ ile verilen ifadelerle değiştirir.

SELECT REPLACE('JACK and JUE','J','BL') "Changes"
     FROM DUAL;
 
Changes
--------------
BLACK and BLUE
 
 
SUBSTR(karakter,m,n)

“karakter” içersinde , m sayısı ile verilen yerden başlayarak n sayısı kadar karakteri alır.


LENGTH(karakter)

“karakter” ifadesinin uzunluğunu sayı değerinde verir.



Tarih Fonksiyonları

SYSDATE

Sistemin o andaki tarih ve saat bilgisini verir.

SELECT TO_CHAR (SYSDATE, 'DD/MM/YYYY HH24:MI:SS') "Şimdiki zaman” FROM DUAL;
 
Şimdiki zaman
-------------------
18/11/2001 18:05:37 

NEXT_DAY(tarih,ifade)

Verilmiş olan “tarih”e bağlı olarak “ifade” yer alan gün bilgisinin eklenerek hangi tarih olduğunun bilgisini verir. Aşağıdaki örnekte 18/11/2001 tarihine bağlı olarak önümüzdeki Saturday (Cumartesi) günün hangi tarihe geldiğini verecektir.

SELECT NEXT_DAY(TO_DATE('18-11-2001','dd-mm-yyyy'),'Saturday') “Gün” FROM DUAL;

Gün
--------------
24/11/2001

LAST_DAY(tarih)

Verilen “tarih” bilgisinin ait olduğu ayın son gününü verir.

SELECT LAST_DAY(TO_DATE('17-09-1992','dd-mm-yyyy')) “Ayın Son Günü” FROM DUAL;

Ayın Son günü
-------------
30-09-1992

ADD_MONTHS(tarih,sayı)

Verilen “tarih” bilgisine “sayı” ekleyerek hangi ayın hangi günü olduğu bilgisini verir. 17-09-1992 tarih bilgisine 2 ay eklendiğinde hangi tarih olduğunu verir.

SELECT ADD_MONTHS(TO_DATE('17-09-1992','dd-mm-yyyy'),2) “Tarih” FROM DUAL;

Tarih
-------------
30-11-1992

TRUNC(tarih,format)

Bu fonkisyon aşağıdaki tabloda gösterilen “format” şekillerine göre verilmiş olan “tarih” bilgisini dönüştürür.
“tarih” bilgisi o anki sistem tarihi (15/06/2001) olarak kabul edilirse ;

YYYY,YEAR
Girilen tarihe göre yılın ilk gününü verir.
SELECT trunc(sysdate,’YYYY’) from dual;

trunc(
-----------
01-JAN-2001
Q
Girilen tarihe göre en yakın çeyrek ayın ilk gününü verir. OCAK-ŞUBAT-MART ilk çeyrek, NİSAN-MAYIS-HAZİRAN ikinci çeyrek dilimlerdir.
SELECT trunc(sysdate,’Q’) from dual;

trunc(
-----------
01-APR-2001
MON,MONTH,MM
Girilen tarihin ait olduğu ayın ilk gününü verir.
SELECT trunc(sysdate,’MON’) from dual;

trunc(
-----------
01-JUN-2001
DY
Girilen tarihin ait olduğu haftanın Pazar gününün tarihini verir.

W
Giirlen tarihe göre önceki haftanın Perşembe günün tarihini verir.




Dönüştürme Fonksiyonları

TO_CHAR(‘tarih’,format)

‘tarih’ biçiminde verilen değeri, ‘format’ ile belirtilen şekile çeviren fonksiyondur.

D
Haftanın gün sayısını verir. (Pazar 1, Pztesi 2...)
To_char(sysdate,’D’)
DD
Tarihin gün değerini ay içindeki sayısı (1..31)
To_char(sysdate,’DD’)
DAY
Tarihin gün adını verir. (SUNDAY,MONDAY...)
To_char(sysdate,’DAY’)
DDD
Tarihin gün değerini yıl içersindeki sayısı (1..366)
To_char(sysdate,’DDD’)
HH,HH12
Saat değerini AM,PM olarak verir
To_char(sysdate,’HH12’)
HH24
Saat değerini 0..23 arasında verir
To_char(sysdate,’HH24’)
MI
Dakika değerini verir.
To_char(sysdate,’MI’)
MM
Tarihin ay sayısını verir (01..12, Ocak 01)
To_char(sysdate,’MM’)
MON
Tarihin ay değerinin kısa adını verir
To_char(sysdate,’MON’)
MONTH
Tarihin ay değerinin uzun adını verir
To_char(sysdate,’MONTH’)
Q
Tarihin hangi çeyrek içersinde olduğunu verir (1..4)
To_char(sysdate,’Q’)
WW
Tarihe göre yıl içinde kaçıncı haftaya ait olduğunu verir.(1..53)

W
Tarihe göre ay içinde kaçıncı haftaya ait olduğunu verir (1..5)

YY,YYYY
Tarihin yıl değerini verir (2 hane veya 4 hane olarak)
To_char(sysdate,’YY’)
YEAR
Tarihin yıl değerinin ingilizce yazılış şeklini verir.


To_char(to_date(’18/11/2001’,’DD,MON,YY’)
18,NOV,01

To_char(sysdate,’DD/MM/YYYY HH24:MI)
06/01/2001 16:30

To_char(sysdate,’Month’)
Ocak


TO_CHAR(sayi,format)

‘Sayi’ biçiminde verilen değeri, ‘format’ ile belirtilen şekile çeviren fonksiyondur.

9
Sayı değerindeki hane sayısı kadar gösterim şekli
To_char(1234,’9999’)
G
Sayı değerini guruplandırır şekilde gösterir
To_char(12345,’999G999’)
D
Sayı değerini noktalı şekilde gösterir
To_char(‘123.254,’999D999’)
L
Sayı değerini ulasal para formatında gösterir (TL, $ gibi)
To_char(‘123254,’999G999L’)
S
Sayı değerini + veya – olarak gösterir
To_char(‘-125’,’999S’)


To_date(karakter,format)

‘Karakter’ biçiminde verilen değeri, ‘format’ olarak gösterilen şekilde tarih biçimine çevirir.

To_date(‘18112001’,’DD/MM/YYYY’)
18/11/2001
To_date(‘27032001,’DD-MM-YYYY’)
27-03-2001






INSERT Komutu (INSERT Statement)

Bir tabloya yeni bir kayıt eklenmesi için kullanılan SQL ifadesidir.

INSERT INTO table_adi (alan1, alan2,...,alann) VALUES (deger1,deger2,...,degern) ;

INSERT ifadesinde alanların sırasıyla VALUES içinde verilen deger’lerin sırası aynı olmalı ve alanların ozellikleri ile aynı ozellikte degerler kulllanılmalıdır. Bu ifade de istenilen alanlar kullanılarak yeni bir kaydın eklenmesi mümkün olur.
Ø  Tablonun yaratılması sırasında NOT NULL değeri verilmiş bir alan kullanılmışsa mutlaka INSERT ifadesinde yer almalıdır.
Ø  Tablonun yaratılması sırasında DEFAULT değeri kullanılan bir alan varsa bu alan INSERT ifadesinde kullanılmayabilir. Tabii değeri DEFAULT değerinden farklı bir değerse kullanılmalıdır.

CREATE TABLE ogrenci (
      ogrenci_no        NUMBER(8) NOT NULL,
      ogrenci_adi       VARCHAR2(10),
      ogrenci_soyadi    VARCHAR2(10),
      ogrenci_dog_tar   date,
      ogrenci_donem     NUMBER(4),
      ogrenci_harc      NUMBER(15),
      cre_date          date DEFAULT sysdate
);

örnek tablosuna kayıt eklenecekse mutlaka ogrenci_no alanın girilmesi gereklidir.

INSERT INTO ogrenci (ogrenci_no, ogrenci_adi, ogrenci_soyadi)
 VALUES (20101001,’AHMET’,’OZKAN’);

Dikkat edilirse bu örnekte ogrenci_dog_tar alanına deger girilmemiştir. Bu kayıtta bu alan boş (NULL) olarak yer alacaktır. Cre_date alanın değeri ise kaydın yaratıldığı andaki tarih değerini otomatik olarak alacaktır.

INSERT INTO ogrenci (ogrenci_adi, ogrenci_soyadi,ogrenci_dog_tar,ogrenci_no)
 VALUES (’AHMET’,’OZKAN’,to_date(‘01/09/2001’,’DD/MM/YYYY’,20101001);

İfadesi de doğrudur. Tek fark, alanların kullanım sırasıdır. Ama alanlara karşı verilen değerler aynı sıradadır.

INSERT INTO ogrenci (ogrenci_adi, ogrenci_soyadi,ogrenci_dog_tar,ogrenci_no)
 VALUES (’AHMET’,0,01/09/2001);

İfadesi ise yanlıştır ve SQL cümleceği çalışmayacaktır.. Ogrenci_soyadi alanı alfasayısal bir değer olmasına karşılık sayısal bir değer verilmiştir. Ogrenci_dog_tar alanı tarih formatında olmasına rağmen uygun bir formatta olmayan bir değer girilmiştir. Son olarak ogrenci_no alanı kullanılmasına rağmen bu alana bir değer ataması yapılmamıştır.


UPDATE Komutu (UPDATE Statement)

Bir tabloda yer alan bir veya birden fazla alanın değerlerinin değiştirilmesi için kullanılan SQL ifadesidir. Bu alanlar bir kayıta ait olabileceği gibi birden fazla kayda da ait olabilir. Bunun için genellikle UPDATE cümleciğinde WHERE ifadesi de kullanılır.

UPDATE table_adi SET alan1=deger1, alan2=deger2... alann=degern [WHERE ....]

Eğer bir UPDATE cümlesinde WHERE ifadesi kullanılmamışsa bu değişiklik bütün tablo üzerinde olacak demektir. Özellikle bu durumlarda kullanıcıların dikkat etmeleri gerekmektedir. WHERE cümleciğinin kullanılmadığı veya yanlış kullanıldığı durumlarda bütün tablonun kayıtlarının güncelleştirileceği göz önünde bulundurulmalıdır.

Yukarıda ki OGRENCI tablosunda girilmiş olan kayıtların içersinde ogrenci_donem 2000 ve ustu olanların ogrenci_harc alanın değerini 20000000 yapmak istersek ;

UPDATE ogrenci
   SET ogrenci_harc=20000000
 WHERE ogrenci_donem>=2000 ;

İfadesini yazmamız gerekecektir.


DELETE Komutu (DELETE Statement)

Bir tablonun istenilen kaydının veya kayıtlarının veya bütün tablonun içeriğinin silinmesi istendiğinde kullanılan SQL cümleciğidir. Tablonun bütün kayıtlarının silinmesi, tablonun boyutunu , bir başka deyişle , yer aldığı TABLESPACE’de kapladığı alanı küçültmez. Tablonun kapladığı alan ne kadarsa bu değer değişmeyecektir. DROP komutuyla karıştırılmamalıdır. Eğer DELETE komutunda WHERE ifadesi yer almaz ise tabloda ki bütün kayıtlar silinecek anlamındadır.

DELETE tablo_adi [WHERE ....];

Yukarıda ki OGRENCI tablosunda girilmiş olan kayıtların içersinde ogrenci_donem 2000 altında olan kayıtları silmek istersek ;

DELETE ogrenci WHERE ogrenci_donem<2000 ;

İfadesini yazmamız gerekecektir.


ROLLBACK ve COMMIT Komutları (ROLLBACK - COMMIT Statement)

Yukarıda ki INSERT, UPDATE ve DELETE komutlarının çalıştırılması sadece çalıştıran kullanıcıyı etkileyecektir. Veritabanını kullanan diğer kullanıcılar bu işlemlerden etkilenmezler. Diğer kullanıcılarında bu işlemleri görmelerini istersek o takdirde bu komutlardan sonra COMMIT komutunu kullanmamız gerekecektir. Böylece tablolar üzerinde yapılan işlemler geçerli olacak ve diğer kullanıcılarda bunları göreceklerdir.

1          Server process, redo log buffer’a bir commit kaydı yapar. Bu kaydı yaparken SCN(System Change Number) kullanır. Bir transaction commit edildiğinde, Oracle Server bu transaction’a, veritabanı için unique olan ve devamlı artan bir SCN verir.
2          LGWR redo log buffer girdilerini, commit kaydı ile beraber, redo log dosyalarına yazar. Bu noktadan sonra, dosya okuma hatası oluşmadıkça, Oracle server değişiklerin kaybolmayacağını garanti eder.
3          COMMIT’in tamamlandığı kullanıcıya bildirilir.
4          Server process, transaction’ın bittiğine ve kilitlerin kaldırılabileceğine dair bilgiyi kaydeder.
           

COMMIT’in avantajları:
            Log dosyalarına sıralı yazmak, veri dosyalarındaki farklı bloklara yazmaktan daha hızlıdır. Log dosyalarına yazılan değişiklikleri kaydeden bilgi çok küçüktür. Bunun yanında veri dosyalarına yazmak, verinin tüm bloklarının yazılmasını gerektirir. Redo log buffer kısmen dolana kadar, transaction başına sadece bir eşzamanlı yazma gereklidir (transaction başına birden az olabilir). Transaction’ın büyüklüğü COMMIT işleminin harcadığı zamanı etkilemez.

Ancak herhangi bir işlemden sonra geri dönülmek istendiğinde ROLLBACK komutunu kullanmak gereklidir. Bu durumda kullanıcının yapmış olduğu işlemler geri alınarak tablo eski haline döndürülür. Veritabanında özellikle tablolarda yapılan değişiklikler çok sayıda kaydı kapsıyorsa önceki halleri ROLLBACK TABLESPACE’de tutulurlar.

Ø  COMMIT komutunu kullandıktan sonra geri dönüş yoktur bundan dolayı ROLLBACK komutu kullanılamaz.


TABLOLAR ARASI BAĞLANTI (JOIN)
           
            İki veya daha fazla tablo arasında bağlantı (join) kurmak demek veritabanına tabloların hangi alanlarının birbirleri ile alakalı olduğunu göstermek demektir.
         
   WHERE a.ILKODU = b.ILKODU

örneğinde seçim yapılan tabloların ilkodu alanlarının birbirleriyle bağlantılı olduğu anlatılmaktadır. Eğer bu bağlantı kurulmazsa sorgu sonucunda seçim listesine yazılan tabloların kayıt sayısının kartezyen çarpımı kadar kayıt gelir. Örneğin yukarıdaki bağlantı kurulmamış olsa idi listeye "a" tablosu ile "b" tablosunun kayıt sayısının çarpımı kadar kayıt listelenecekti.Yani "a" tablosundaki her kaydı "b" tablosundaki bütün kayıtlarla eşleştirme yaparak listeleyecektir.

            Tablolar arası bağlantıları ikiye ayırabiliriz.
            İçine Bağlantı (Inner Join)
                        Dışına Bağlantı (Outer Join)

            İçine Bağlantı (Inner Join)

            İçine bağlantılarda listeye sadece bağlantı kurulan alanları eşleşebilen kayıtlar gelir.İçine bağlantı, bağlantı kurulan alanlar arasına "=" işareti konarak yazılır. Bizlerin bugüne kadar öğrendikleri bu şekilde bağlantıydı.

Örneğin
            WHERE a.ILKODU = b.ILKODU
Bu örnekte "a" tablosunda ilkodu boş(null) olmayan ve de ilkodu "b" tablosunda bulunan kayıtlar listelenir. "a" tablosunda ilkodu boş(null) olanlanlara karşılık "b" tablosunda bir eşleşme olamayacaktır, çünkü null=5 gibi bir eşleşme olamaz. Ayrıca "b" tablosunda olmayan bir ilkoduna sahip firmalar da listelenemezler, çünkü ilkodu 15 olan bir firma varsa ve "b" tablosunda da 15 kodlu il yoksa eşleşme olamaz.

Dışına Bağlantı (Outer Join)

            Dışına bağlantılarda listeye tabloların birindeki tüm kayıtlar ve diğerinde ise bağlantıya karşılık gelen kayıtlar gelir.
Dışına bağlantı, bağlantı kurulan alanlar arasına "=" işareti ve tüm kayıtların getirilmesi istenen tablonun karşı tarafındaki tabloya (+) konarak yazılır. Dışına bağlantılar tabloların herhangi birindeki kayıtların tümü listelenmek istendiğinde kurulur.

Örnek1 ;
SELECT ename, job, dept.deptno, dname
    FROM emp, dept
    WHERE emp.deptno (+) = dept.deptno;

ENAME      JOB       DEPTN      DNAME
---------- --------- ---------- --------------
CLARK      MANAGER           10 ACCOUNTING
KING       PRESIDENT         10 ACCOUNTING
MILLER     CLERK             10 ACCOUNTING
SMITH      CLERK             20 RESEARCH
ADAMS      CLERK             20 RESEARCH
FORD       ANALYST           20 RESEARCH
SCOTT      ANALYST           20 RESEARCH
JONES      MANAGER           20 RESEARCH
ALLEN      SALESMAN          30 SALES
BLAKE      MANAGER           30 SALES
MARTIN     SALESMAN          30 SALES
JAMES      CLERK             30 SALES
TURNER     SALESMAN          30 SALES
WARD       SALESMAN          30 SALES
                             40 OPERATIONS

Bu ornekte , "dept" tablosundaki tüm kayıtlar "emp" tablosuyla eslesme olsa da olmasa da listelenmistir.

Örnek2 ;
SELECT ename, job, dept.deptno, dname
    FROM emp, dept
    WHERE emp.deptno (+) = dept.deptno
        AND job (+) = 'CLERK';

ENAME      JOB       DEPTNO     DNAME
---------- --------- ---------- --------------
MILLER     CLERK             10 ACCOUNTING
SMITH      CLERK             20 RESEARCH
ADAMS      CLERK             20 RESEARCH
JAMES      CLERK             30 SALES
                             40 OPERATIONS

Burada , "emp" tablosundaki job alanında CLERK olanların listelenmistir. Ancak job alanında kullanılan (+) işareti ile ilk şartın yerine getirilmesi sağlanmıştır.

Dışına Bağlantı (Outer Join) kurulmasındaki bazı kurallar ;

- (+) işareti sadece WHERE cümleciğinde kullanılmaktadır.
- A ve B tablolarında çoklu bağlantı şartları kullanılmışsa, (+) işareti tüm koşul satırlarında olmak zorunda.
- (+) işareti ile IN koşulunda kullanılmaz, OR ile ayrılan şart cümleciğinde kullanılmaz,
- Karşılaştırma (+) işareti ile birlikte alt sorgulamalarda kullanılmaz.


Aşağıda verilmiş olan tablolar ve sorgulamalar konunun daha iyi anlaşılmasına yardımcı olacaktır.


SELECT custno, custname
    FROM customers;

CUSTNO     CUSTNAME
---------- --------------------
1          Angelic Co.
2          Believable Co.        
3          Cabels R Us

SELECT orderno, custno,
    TO_CHAR(orderdate, 'MON-DD-YYYY') "ORDERDATE"
    FROM orders;

ORDERNO    CUSTNO     ORDERDATE
---------- ---------- -----------
      9001          1 OCT-13-1993
      9002          2 OCT-13-1993
      9003          1 OCT-20-1993
      9004          1 OCT-27-1993
      9005          2 OCT-31-1993

3 no.lu firmaya ait sipariş girilmemiştir.

SELECT orderno, lineno, partno, quantity
    FROM lineitems;

ORDERNO    LINENO     PARTNO     QUANTITY
---------- ---------- ---------- ----------
      9001          1        101         15
      9001          2        102         10
      9002          1        101         25
      9002          2        103         50
      9003          1        101         15
      9004          1        102         10
      9004          2        103         20

9005 no.lu siparişin alt detayları yoktur.

SELECT partno, partname
    FROM parts;

PARTNO PARTNAME
------ --------
   101 X-Ray Screen
   102 Yellow Bag       
   103 Zoot Suit



SELECT custname, TO_CHAR(orderdate, 'MON-DD-YYYY') "ORDERDATE"
    FROM customers, orders
    WHERE customers.custno = orders.custno (+);

CUSTNAME             ORDERDATE
-------------------- --------------
Angelic Co.          OCT-13-1993
Angelic Co.          OCT-20-1993
Angelic Co.          OCT-27-1993
Believable Co.       OCT-13-1993
Believable Co.       OCT-31-1993
Cables R Us

Bu örnekte bütün müşterilere ait siparişlerin tarihleri listelenmesi istenmiştir. Dikkat edilirse "Cables R Us" isimli müşteriye ait sipariş olmamasına rağmen listede yer almıştır. (+) işareti "orders" table yanında olduğu için "customer" tablosundaki tüm kayıtlar listelenecektir.

SELECT custname,
TO_CHAR(orderdate, 'MON-DD-YYYY') "ORDERDATE",
partno, quantity
    FROM customers, orders, lineitems
    WHERE customers.custno = orders.custno (+)
    AND orders.orderno = lineitems.orderno (+);

CUSTNAME             ORDERDATE          PARTNO   QUANTITY
-------------------- -------------- ---------- ----------
Angelic Co.          OCT-13-1993           101         15
Angelic Co.          OCT-13-1993           102         10
Angelic Co.          OCT-20-1993           101         15
Angelic Co.          OCT-27-1993           102         10
Angelic Co.          OCT-27-1993           103         20
Believable Co.       OCT-13-1993           101         25
Believable Co.       OCT-13-1993           103         50
Believable Co.       OCT-31-1993
Cables R Us

Yukarıdaki örnek, bir önceki örneğin devamı olmakla beraber "orders" tablosunda yer alan bütün siparişleri listelemiştir.

SELECT custname, TO_CHAR(orderdate, 'MON-DD-YYYY') "ORDERDATE",
    quantity, partname
    FROM customers, orders, lineitems, parts
    WHERE customers.custno = orders.custno (+)
    AND orders.orderno = lineitems.orderno (+)
    AND lineitems.partno = parts.partno (+);

CUSTNAME             ORDERDATE        QUANTITY PARTNAME
-------------------- -------------- ---------- ------------
Angelic Co.          OCT-13-1993            15 X-Ray Screen
Angelic Co.          OCT-13-1993            10 Yellow Bag
Angelic Co.          OCT-20-1993            15 X-Ray Screen
Angelic Co.          OCT-27-1993            10 Yellow Bag
Angelic Co.          OCT-27-1993            20 Zoot Suit
Believable Co.       OCT-13-1993            25 X-Ray Screen
Believable Co.       OCT-13-1993            50 Zoot Suit
Believable Co.       OCT-31-1993
Cables R Us

Bu örnekte diğer örneklerin devamı olmakla beraber bütün parçaları da listelemiştir.

Bu örneklerin yorumlamasında "Believable" firmasına ait siparişin niye alt detayları yok ? "Cables" firmasına ait niye hiç sipariş yok ? Bunların sorularını cevaplayacak SQl cümlecikleri bu şekilde olacaktır.


UNION             Bütün kayıtların seçilmesi
UNION ALL       Bütün kayıtların seçilmesi (tekrar eden kayıtlarda dahildir)
INTERSECT       İki sorgulama cümleciğinde de olan kayıtların seçilmesi
MINUS              İlk sorgulamada olan ancak ikinci sorgulamada olmayan kayıtların seçilmesi

Yukarıdaki SQL fonksiyonları SELECT cümleciği ile birlikte kullanılmaktadır. Bu fonksiyonları kullanabilmek için sorgu cümleciklerinde aynı sayıda ki veri alanlarının aynı tipte olması gerekmektedir.

Sorguda kulllanılan veri tipi CHAR ise sonuç değer CHAR veri tipinde dönecektir.
Sorguda kulllanılan veri tipi VARCHAR2 ise sonuç değer VARCHAR2 veri tipinde dönecektir.

Aşağıdaki iki tablo konu içinde yer alan örneklerde kullanılacaktır.

SELECT part
    FROM orders_list1;

PART 
---------- 
SPARKPLUG 
FUEL PUMP 
FUEL PUMP 
TAILPIPE 

SELECT part 
    FROM orders_list2;

PART 
---------- 
CRANKSHAFT 
TAILPIPE 
TAILPIPE 





UNION

Aşağıdaki SQL cümleciğinde order_list1 tablosu ile order_list2 tablosu karşılaştırılarak aynı olan kayıtlar alınmamamıştır. Ayrıca ikinci tabloda olmayan alanın nasıl kullanıldığına dikkat ediniz.


SELECT part, partnum, to_date(null) date_in
    FROM orders_list1
UNION
SELECT part, to_null(null), date_in
    FROM orders_list2;

PART       PARTNUM DATE_IN
---------- ------- -------- 
SPARKPLUG  3323165 
SPARKPLUG          10/24/98
FUEL PUMP  3323162
FUEL PUMP          12/24/99
TAILPIPE   1332999
TAILPIPE           01/01/01
CRANKSHAFT 9394991
CRANKSHAFT         09/12/02


Bu örnekte sadece "part" alanı kullanıldığından her iki tabloda yer alan aynı kayıtlar seçilmemiştir.

SELECT part 
    FROM orders_list1 
UNION 
SELECT part 
    FROM orders_list2;

PART 
---------- 
SPARKPLUG 
FUEL PUMP 
TAILPIPE 
CRANKSHAFT 



UNION ALL

Bu fonksiyon, UNION aksine , aynı olan kayıtları da seçerek listeleyecektir.

SELECT part 
    FROM orders_list1 
UNION ALL 
SELECT part 
    FROM orders_list2;

PART 
---------- 
SPARKPLUG 
FUEL PUMP 
FUEL PUMP 
TAILPIPE 
CRANKSHAFT 
TAILPIPE 
TAILPIPE 



INTERSECT

İki sorgu cümleciğinde, ikisinde de yer alan kayıtları seçerek listeler.

Aşağıdaki örnekte, "orders_list1" tablosunda ve "orders_list2" tablosunda olan sadece TAILPIPE olduğu için tek kayıt listelenmiştir.

SELECT part 
    FROM orders_list1 
INTERSECT 
SELECT part 
    FROM orders_list2;

PART 
---------- 
TAILPIPE 




MINUS

İki sorgu cümleciğinden, ilkinde olup ta ikincide olmayan kayıtlar seçilerek listelenir.

Aşağıdaki örnekte, "orders_list1" tablosunda olupta "orders_list2" tablosunda olmayan "SPARKPLUG" ve "FUEL PUMP" olduğu için seçilerek listelenmiştir.

SELECT part 
    FROM orders_list1 
MINUS 
SELECT part 
    FROM orders_list2;

PART 
---------- 
SPARKPLUG 
FUEL PUMP




Bu komutlarla ilgili başka örneklerde verilmek istenirse ;

CREATE TABLE elemanlar (
      eleman_no   number(3),
      adi         varchar2(15),
      soyadi      varchar2(10)
);

CREATE TABLE mutseriler (
      Musteri_no  number(5),
      Unvan       varchar2(20),
eleman_no   number(3)
);

Şeklinde iki tablomuz olsun. “Elemanlar” tablosunda satış elemanları tanıtılmış, “Musteriler” tablosunda da eleman_no alanı ile bu musteriye atanmış satış elemanları tanıtılmıştır.

Hiçbir müşteriye ataması yapılmamış satış elemanlarının listesi nedir ?

Bu sorgunun cevabını verebilmek için “elemanlar” tablosunda olan ama “musteriler” tablosunda olmayan kayıtların listesini almak yeterlidir. Yani ;

SELECT eleman_no FROM elemanlar
MINUS
SELECT eleman_no FROM musteriler;

Müşterilere atanması yapılmış satış elemanlarının listesi nedir ?

Bu sorgunun cevabını verebilmek için “elemanlar” tablosu ile “musteriler” tablosunda aynı olan kayıtların listesini almak yeterlidir.

SELECT eleman_no FROM elemanlar
INTERSECT
SELECT eleman_no FROM musteriler;


TRIGGER

Veritabanında yer alan TABLO ve bu tabloya ait kayıtlar üzerinde INSERT, UPDATE ve DELETE komutlarının işlemesi öncesinde veya sonrasında devreye giren SQL komutlar dizine TRIGGER denir.

TRIGGER kelime anlamı olarak “Tetikleme” şeklindedir. Veritabanında yer alan tablolar üzerinde sadece kayıt ekleme, değiştirme ve silme işlemleri sırasında çalışacak olan SQL komutları topluluğudur.

INSERT, UPDATE ve DELETE komutu veritabanına gönderildiği zaman sunucu üzerinde yaratılmış olan trigger’lar ya işlemin öncesinde veya işlemin sonrasında çalışacaklardır.




COMMIT veya
ROLLBACK
 
AFTER
TRIGGER
 
BEFORE
TRIGGER
 
INSERT
UPDATE
DELETE


TRIGGER’ların kullanım amaçları ;

Ø  Tablolar üzerindeki işlemlerin denetim ve kontrol altında tutulmasına yönelik,
Ø  Tabloların alanlarına verilebilecek değerlerin kontrol edilmesi,
Ø  Tablolar arasındaki ilişkilendirmelerin denetlenmesi,

şeklindedir. Trigger’lar sunucu üzerinde çalışacakları için yönetim ve değişiklik yapılması kolaydır. Böylece veritabanında yer alan tabloların alanlarında yer alacak değerlerin son bir kez denetlenmesi mümkün olmaktadır. Programlar tarafından kontrol edilmekle beraber özellikle çeşitli yerlerden tablolara işlem yapılması mümkün olduğundan kritik kontrollerin, denetlemelerin bu triggerlar üzerinde yapılması önerilmektedir.

Sunucuya gönderilen INSERT, UPDATE veya DELETE komutundan ÖNCE ve/veya SONRA trigger devreye girecektir. Bu esnada tablo üzerinde değişiklikler kontrol edilir ve COMMIT komutuna kadar bu işlemler diğer kullanıcılara yansıtılmaz.

Trigger içersinde yer alacak kontrollerin, denetimlerin kısacası işlemlerin her kayıt için yapılacağının bilinmesi lazımdır. Gereksiz hiçbir işlemin özellikle kontrollerin trigger içersinde yer almamasına dikkat edilmelidir. Çünkü her kayıt eklemede veya değiştirmede veya silmede  trigger devreye girecek ve kontrolleri yapacaktır. Bu da sistemin performansını etkileyecektir. Genel olarak kullanıcıların işlem yapma zamanlarını etkileyeceğinden özellikle üzerinde çok INSERT, UPDATE ve DELETE işlemlerinin sıkça yapıldığı tablolarda etki komutları içeren trigger’lar kullanılmasına dikkat edilmelidir.

Trigger yaratma komutu aşağıdaki gibidir.

CREATE or REPLACE TRIGGER trigger_adi
 BEFORE INSERT OR DELETE OR UPDATE ON tablo_adi
 FOR EACH ROW
  BEGIN
    IF INSERTING THEN
        ............
    END IF;
    IF DELETING THEN
        ............
    END IF;
    IF UPDATING('alan_adi') THEN
        ............
    IF UPDATING THEN
        ............
    END IF;
  END;

Veritabanında herşey bir obje olduğundan ve bu objeler SYSTEM altında ilgili tablolar içerisinde tutulduğundan dolayı yaratılacak her trigger’a biri isim verilecektir. Trigger isimlendirilmesinde de anlaşılır, kolayca çözülebilir notasyonların kullanılması önerilmektedir. (Trg_biud_tablo_adi veya Trg_aiud_tablo_adi şeklinde...)

Burada CREATE komutuyla birlikte aynı zamanda REPLACE seçeneği de kullanılmıştır. Böylece ileride trigger üzerinde değişiklik yapılmak istendiği zaman var olan trigger değiştirilmiş olacaktır.

BEFORE INSERT or UPDATE or DELETE şeklindeki ifade ile bu trigger ; INSERT, UPDATE veya DELETE komutlarından ÖNCE çalışacaktır.

AFTER INSERT or UPDATE or DELETE şeklindeki ifade ile bu trigger ; INSERT, UPDATE veya DELETE komutlarından SONRA çalışacaktır.

ON tablo_adi ifadesi ile bu trigger’ın hangi tabloya ait olduğu belirtilmektedir.

FOR EACH ROW ifadesi ile bu trigger içindeki komutlar tabloda ki tüm kayıtlar için çalışacak anlamındadır.

IF INSERTING ifadesi ile bu trigger içinde sadece tabloya kayıt ekleme esnasında devreye girecek SQL ifadeleri yer alacaktır.

IF DELETING ifadesi ile bu trigger içinde sadece tablodan kayıt silinmesi esnasında devreye girecek SQL ifadeleri yer alacaktır.

IF UPDATING ifadesi ile bu trigger içinde sadece tabloda ki kayıtların değiştirilmesi esnasında devreye girecek SQL ifadeleri yer alacaktır.

IF UPDATING(‘alan_adi’) ifadesi ile bu trigger içinde sadece tablonun bir alanında değişiklik yapıldığında devreye girecek SQL ifadeleri yer alacaktır.

Görüldüğü üzere bir trigger içinde aynı anda tüm işlemlerin kontrolü ÖNCE’den (BEFORE) sağlanmış olacaktır. Aynı şekilde bu kontroller veya diğer tablolara etkileri SONRA’da (AFTER) olabilir.

Ø  Trigger’lar içinde kullanılacak SQL komutlarının 60 satırı geçmemesi önerilmektedir.

Ø  Tablo üzerindeki işlemlerin kontrolü sırasında tablo üzerinde başka bir işlemin (Insert, Update, Delete) devreye girmemesine dikkat edilmelidir. Bu takdirde aynı trigger devreye gireceğinden işlemler başarısız olur ve trigger hatası verilir.

Ø  Trigger’ların kolayca yönetilmesi için çoğunlukla INSERT, UPDATE ve DELETE işlemleri için ayrı ayrı trigger’lar yazılması önerilir. Böylece bir tabloya ait en fazla 6 adet trigger olabilir.

Trigger komutu içinde kullanılan FOR EACH ROW ifadesi eğer kullanılmaz ise trigger içersinde tüm kayıtlar için değil, tablo genelinde kontroller yapılacak anlamındadır.

CREATE TRIGGER trg_biud_emp
    BEFORE DELETE OR INSERT OR UPDATE ON emp 
    DECLARE 
        kaysay INTEGER; 
    BEGIN 
        /* Cumartesi veya Pazar Kontrolü */ 
        IF (TO_CHAR(SYSDATE,'DY') = 'CMT' OR TO_CHAR(SYSDATE, 'DY') = 'PAZ') 
         THEN raise_application_error( -20501, 
       'Tatil günlerinde tablo üzerinde değişiklik yapılamaz'); 
        END IF; 
       /* Resmi tatillerin kontrolü */ 
        SELECT COUNT(*) 
         INTO dummy 
          FROM tatil_gunleri WHERE gun = TRUNC(SYSDATE); 
        IF dummy > 0 
         THEN raise_application_error( -20501, 
          'Resmi Tatil günlerinde tabloda değişiklik yapılamaz'); 
        END IF; 
        /* 8:00 ve 18:00 kontrolü */ 
        IF (TO_CHAR(SYSDATE, 'HH24') < 8 OR  TO_CHAR(SYSDATE, 'HH24') >= 18) 
          THEN raise_application_error( -20502, 
       'Çalışma saatleri dışında tabloda işlem yapılamaz'); 
        END IF; 
      END; 
Yukarıda ki örnek trigger, EMP tablosu üzerinde INSERT, UPDATE ve DELETE işlemlerinden önce çalışacaktır. Ancak her kayıt için değil tablo genelinde devrededir.

Trigger içinde değişken kullanıldığından bu değişken adı ve tipi DECLARE satırında gösterilmiştir.

Eğer trigger içinde ki kontroller geçersiz sonuç verirse RAISE_APPLICATION_TRIGGER komutu ile hata mesajı kullanıcıya verilecek ve trigger’dan çıkılmış olacaktır. Diğer satırlar çalışmayacaktır.

Eğer bir trigger içinde SELECT ifadesi sonucunda bir değer ataması yapılacaksa bu SELECT .. INTO ifadesinin kullanılmasıyla olacaktır. Burada  ; 
SELECT COUNT(*)    
  INTO kaysay
  FROM tatil_gunleri 
 WHERE gun = TRUNC(SYSDATE); 

DECLARE ifadesi ile tam sayı olarak tanımlanmış olan KAYSAY değişkenine, tatil_gunleri dosyasında ki GUN alanı ile işlem tarihi eşit olan kayıt sayıları COUNT(*) komutuyla bulunmuş ve  INTO ifadesi ile değeri atanmıştır.

TRIGGER’lar veritabanında yaratıldıktan veya üzerinde değişiklikler yapıldıktan sonra derlenmeleri gerekmektedir. Eğer bir trigger içersinde yer alan bir tablo DROP edilmişse bu trigger geçersiz duruma düşecek ve o komut satırı çalıştığında hata vererek çalışması kesilecektir. Bunun için özellikle veritabanı yöneticilerinin sistem içersinde yer alan tabloları ve ilgili triggerları sürekli kontrol altında tutmaları gerekmektedir.

Trigger içersinde tabloda kullanılan alanların YENI (NEW) ve ESKI (OLD) değerleri aynı anda kullanılmaktadır.

Ø  INSERT ifadesi sırasında alanların :NEW değeri bulunur. Tabloya yeni bir kayıt ilave edildiğinden alanların ilk değerleri yenidir ve :NEW olarak kullanılır. Alanın eski değeri null dur.
Ø  DELETE ifadesi sırasında alanların :OLD değeri bulunur. Tabloda var olan bir kayıt silindiğinde alanların eski değerleri (:OLD) mevcuttur, yeni değeri null dur.
Ø  UPDATE ifadesi sırasında alanların hem :NEW hem de :OLD değeri bulunur. Tabloda kayıtlarda üzerindeki alanlarda değişiklik yapıldığından alanın eski (İOLD) ve yeni (:NEW) değerleri mevcuttur.

Ancak alanların :NEW ve :OLD değerleri BEFORE TRIGGER işleminde geçerli olmaktadır çünkü AFTER TRIGGER’da tablodaki değişiklikler yapıldığından alanın yeni değerini kullanacaktır.

Trigger’larda BEFORE seçeneği daha çok kullanılmaktadır. Çünkü tabloya etki edecek değişikliklerin yapılmadan önce kontrol edilmesi gerek şarttır. AFTER seçeneği ise bir tablonun değişiminden sonra etkilemesi gereken başka bir tablolar varsa onların üzerinde işlem yapılmasını sağlayacaktır.

Bir trigger içersinde, veritabanında yaratılmış olan bir PROCEDURE veya FUNCTION çağrılması mümkündür. Özellikle tekrar eden durumlarda, SQL satır sayısının fazla olduğu durumlarda kullanılabilir.

Bir tablo üzerinde bir seferinde çok sayıda kayıt üzerinde işlem yapılmak istendiği durumlarda veya girilmiş olan kayıtların tekrar düzenlemesi durumlarında, veritabanı yöneticisi trigger’ların çalışmasını geçici olarak durdurabilir. İşlemlerden sonra tekrar trigger’ı aktif edecektir. Bu işlemlerin, veritabanında kimsenin çalışmayacağı zamanda olması mutlak şarttır. Aksi takdirde, tabloların ve alanların bilgi girişleri güvenli olmayacak ve tutarsız değerler olabilecektir.

Trigger’ların çalışmasını geçici olarak durduran komut ALTER TRIGGER’dır.

ALTER TRIGGER Komutu  

Trigger’ları devreden çıkaran veya devreye alan veya derleyeme amacıyla kullanılır.

ALTER TRIGGER [ENABLE] trigger_adi
              [DISABLE]
              [COMPILE]

ENABLE                        devre dışı (DISABLE) durumunda olan triggerı çalışmak üzere tekrar devreye alır
DISABLE           trigger devre dışındadır, trigger içindeki komutlar çalışmayacaktır.
COMPILE          trigger derlenecek ve varsa içersindeki hatalar kullanıcıya gösterilecektir.




CREATE TABLE musteriler (
      must_kod    varchar2(3),
      must_unvan  varchar2(15),
      must_tar    date,
      cre_user    varchar2(10),
      cre_date    date  DEFAULT sysdate,
      mod_user    varchar2(10),
      mod_date    date
);

CREATE TABLE islemler (
      islem_must  varchar2(3),
      islem_tar   date,
      islem_tut   number(15),
      cre_user    varchar2(10),
      cre_date    date  DEFAULT sysdate,
      mod_user    varchar2(10),
      mod_date    date,
) ;

Bu örnekte ISLEMLER tablosu (islem_must) ile MUSTERILER tablosu (must_kod) alanları ile bağlı olacağını düşünürsek ve bunun için FOREIGN KEY kullanılmadığı durumarda kontrollerin TRIGGER’lar içinde nasıl olduğunu görelim.

CREATE OR REPLACE TRIGGER trg_biud_musteriler
      BEFORE INSERT or UPDATE or DELETE ON musteriler
      FOR EACH ROW
      DECLARE
            Kaysay  INTEGER;
      BEGIN
            /* Musteri kaydinin silinmesinin kontrolu */
            IF DELETING THEN
                  SELECT count(*) INTO kaysay FROM islemler
WHERE islem_must = :old.must_kod;
IF kaysay>0 THEN
      RAISE_APPLICATION_ERROR(‘20501’,
’Islemler dosyasinda kullanilan musteri silinemez’);
                  END IF;
            END IF;
            /* must_kod alanin degisikliginin kontrolu */
            IF UPDATING(‘must_kod’) THEN
RAISE_APPLICATION_ERROR(‘20501’,
’bu alanda degisiklik yapilamaz’);
            END IF;
            /* Kayit eklerken ilgili alanlara otomatik deger aktarilmasi */
            IF INSERTING THEN
                  :new.credate := SYSDATE;
                  :new.creuser := USER;
            END IF;
            /* Kayit degisikliginde ilgili alanlara otomatik deger aktarilmasi */
            IF UPDATING THEN
                  :new.moddate := SYSDATE;
                  :new.moduser := USER;
            END IF;
      END;

Dikkat edilecek noktalar ;
     
Ø  MUSTERILER tablosundan kayıt silerken, ISLEMLER dosyasında kullanılıp kullanılmadığının kontrolü yapılmış ve en az bir kayıt bulunmuşsa kaydın silinmesi engellenmiştir.
Ø  UPDATING(‘must_kod’) satırı UPDATING satırından önce kullanılmıştır. Böylece alan değişikliğinin yapılmasına izin verilmeyecektir.
Ø  Tabloya yeni kayit girisinde CREDATE ve CREUSER alanlarına sistem tarafından otomatik degerlerin atanmasi sağlanmıştır.
Ø  UPDATING kontrolünde sadece MODUSER ve MODDATE alanlari güncellenmiştir. Kayıt yaratılma sırasında kullanılan CREDATE ve CREUSER alanlarında değişiklik yapılmamıştır.


CREATE OR REPLACE TRIGGER trg_biu_islemler
      BEFORE INSERT or UPDATE ON islemler
      FOR EACH ROW
      DECLARE
            Kaysay  INTEGER;
      BEGIN
            Kaysay := 0 ;
            /* Yeni giris kontrolu */
            IF INSERTING THEN
                  SELECT count(*) INTO kaysay FROM musteriler
WHERE must_kod = :new.islem_must;
IF kaysay=0 THEN
      RAISE_APPLICATION_ERROR(‘20501’,
’Musteriler dosyasinda olmayan musteri eklenemez’);
                  END IF;
                  :new.credate := SYSDATE;
                  :new.creuser := USER;
            END IF;
            /* must_kod alanin degisikliginin kontrolu */
            IF UPDATING(‘islem_must’) THEN
RAISE_APPLICATION_ERROR(‘20501’,
’bu alanda degisiklik yapilamaz’);
            END IF;
            /* Kayit degisikliginde ilgili alanlara otomatik deger aktarilmasi */
            IF UPDATING THEN
                  :new.moddate := SYSDATE;
                  :new.moduser := USER;
            END IF;
      END;