A'dan Z'ye Kapsamlı Oracle Veritabanı Yönetimi Eğitimi

1.1 Veritabanı Nedir?

1.1 Veritabanı Nedir?

Veritabanı, verilerin düzenli, güvenli ve hızlı bir şekilde depolanmasını, yönetilmesini ve erişilmesini sağlayan sistematik bir koleksiyondur. Modern işletmelerin karar verme süreçlerinin temelini oluşturur.

Veritabanı Sistemlerinin Amacı

  • Veri Bütünlüğü (Integrity): Verilerin doğru ve tutarlı olmasını sağlamak.
  • Güvenlik: Yetkisiz erişimi engellemek ve verileri korumak.
  • Eşzamanlılık (Concurrency): Aynı verilere birden çok kullanıcının aynı anda güvenli bir şekilde erişmesini sağlamak.
  • Kalıcılık (Persistence): Verilerin uzun süreli depolanmasını sağlamak.

İlişkisel Veritabanı Yönetim Sistemleri (RDBMS)

Oracle Database, bu mimarinin en güçlü örneklerindendir. Veriler tablolar (ilişkiler) halinde saklanır ve bu tablolar arasında mantıksal bağlantılar kurulur.

1.2 Oracle Database Nedir?

Oracle Database, Oracle Corporation tarafından geliştirilen, dünya genelinde kurumsal seviyede en yaygın kullanılan İlişkisel Veritabanı Yönetim Sistemlerinden (RDBMS) biridir.

Oracle'ın Temel Özellikleri

  • Kurumsal Düzeyde Ölçeklenebilirlik: Milyarlarca kaydı ve binlerce eşzamanlı kullanıcıyı yönetebilme kapasitesi.
  • Yüksek Erişilebilirlik (HA): RAC (Real Application Clusters) ve Data Guard gibi teknolojilerle kesintisiz çalışma garantisi.
  • Güvenlik: Gelişmiş şifreleme, erişim kontrolü ve denetim (auditing) özellikleri.
  • PL/SQL Desteği: SQL komutlarını prosedürel programlama mantığıyla birleştiren güçlü bir dil.

Oracle, finans, telekomünikasyon, havacılık gibi kritik sektörlerde veri yönetiminin omurgasını oluşturur.

1.3 Oracle Versiyonları ve Bileşenleri

Oracle, yıllar içinde birçok önemli sürüm çıkarmıştır (8i, 9i, 10g, 11g, 12c, 18c, 19c, 21c). Güncel sürümlerdeki 'c' Cloud (Bulut) uyumluluğunu ifade eder.

Önemli Sürümler

Versiyon Özellik
**11g** Grid Computing odaklı, DBA'lar için önemli bir kararlılık.
**12c** Multitenant Architecture (CDB/PDB) ve Cloud altyapısı odaklı yenilikler.
**19c** Uzun Süreli Destek (LTS) sürümü, 12c'nin stabilitesini artırır.

Temel Yazılım Bileşenleri

  • Database Server: Veriyi yöneten ana yazılım.
  • Client Software (SQL Developer): Kullanıcıların veritabanına bağlanmasını ve sorgu yapmasını sağlayan araçlar.
  • PL/SQL Engine: Prosedürel kodları (Stored Procedures, Functions) işleyen motor.

1.4 Oracle Veritabanı Mimarisi (Instance, Database, SGA, PGA)

Oracle mimarisi, fiziksel dosyalar ve bellek yapıları olmak üzere iki ana bölümden oluşur. Bir Veritabanı (Database), fiziksel dosyalar kümesidir; bir Örnek (Instance) ise bellek yapıları ve arka plan süreçleri kümesidir.

Bellek Yapıları (Memory Structures)

  • SGA (System Global Area): Tüm kullanıcı süreçleri tarafından paylaşılan bellektir. En kritik bileşenler:
    • **Database Buffer Cache:** Veri bloklarının geçici olarak tutulduğu yer (okuma/yazma hızını artırır).
    • **Shared Pool:** SQL, PL/SQL kodlarının ve veri sözlüğü (Data Dictionary) bilgilerinin tutulduğu yer.
  • PGA (Program Global Area): Her bir sunucu süreci (yani her bir kullanıcı bağlantısı) için ayrı ayrı ayrılan bellek alanıdır.
    • Sorgu sırasında sıralama (Sort) veya karma (Hash) işlemlerinin yapıldığı alandır.

Fiziksel Dosyalar

  1. **Datafiles:** Asıl verinin tutulduğu dosyalardır.
  2. **Control Files:** Veritabanının durumunu ve yapısını tutan kritik dosyalardır.
  3. **Redo Log Files:** Yapılan tüm değişiklikleri kaydeden işlem günlükleridir (kurtarma için hayati önem taşır).

1.5 Oracle Kurulumu ve SQL Developer Kullanımı

Oracle'ı yerel makinenize kurmak, geliştirme veya öğrenme ortamı oluşturmanın ilk adımıdır. Genellikle Oracle Express Edition (XE) veya tam sürüm indirilerek kurulum yapılır.

Kurulum Adımları (Özet)

  1. Oracle web sitesinden kurulum dosyasını indirin.
  2. Kurulum sihirbazını başlatın ve lisans anlaşmasını onaylayın.
  3. Kurulum tipini seçin (Genellikle masaüstü/geliştirici kurulumu).
  4. Sistem kullanıcıları (SYS, SYSTEM) için bir şifre belirleyin.
  5. Kurulum tamamlandığında, temel veritabanı yapısı otomatik olarak oluşturulur.

SQL Developer Kullanımı

SQL Developer, Oracle için popüler, ücretsiz, grafiksel bir geliştirme ortamıdır. SQL komutlarını yazmayı, nesneleri yönetmeyi ve PL/SQL geliştirmeyi kolaylaştırır.

  • Bağlantı Oluşturma: Yeni bağlantı sihirbazında veritabanı adını, kullanıcı adını (örneğin: `HR`, `SYSTEM`) ve şifresini girerek hızlıca bağlanabilirsiniz.
  • Sorgu Penceresi: SQL komutlarını yazdığınız ana alandır.

1.6 Oracle Veritabanına Bağlantı Yöntemleri (SQL*Plus, SQL Developer)

Oracle veritabanına erişmek için temel olarak iki ana yöntem kullanılır:

1. Grafiksel Arayüz (GUI) - SQL Developer

Daha önce bahsedilen SQL Developer, tablo ve şema yapılarını görsel olarak incelemeye, sorguları renklendirmeye ve sonuçları kolayca görmeye olanak tanır. Çoğu geliştirici ve DBA'nın tercihidir.

2. Komut Satırı Arayüzü (CLI) - SQL*Plus

SQL*Plus, Oracle'ın geleneksel komut satırı aracıdır. Sistem yöneticileri ve otomasyon işlemleri için hala önemlidir. Kurulumla birlikte gelir.

Örnek Bağlantı Komutu:

sqlplus KULLANICI_ADI/ŞİFRE@VERİTABANI_SERVİS_ADI

veya

sqlplus / as sysdba (Yönetici yetkileriyle bağlanmak için)

TNS (Transparent Network Substrate)

Oracle'da ağ bağlantıları genellikle tnsnames.ora dosyası tarafından yönetilir. Bu dosya, veritabanı servis adının (örneğin: ORCL) fiziksel ağ adresi (host, port) ile eşleştirilmesini sağlar.

2.1 SQL Nedir ve Kullanım Amaçları

SQL (Structured Query Language), ilişkisel veritabanlarını yönetmek ve onlarla iletişim kurmak için kullanılan standart dildir. Oracle, SQL'in yanı sıra PL/SQL adında kendi prosedürel uzantısını da kullanır.

SQL'in Ana Alt Dilleri (Grup Komutları)

  • DDL (Data Definition Language): Veritabanı nesnelerinin yapısını tanımlar ve değiştirir (CREATE, ALTER, DROP).
  • DML (Data Manipulation Language): Tablolardaki verileri manipüle eder (INSERT, UPDATE, DELETE).
  • DCL (Data Control Language): Kullanıcı yetkilerini ve erişimi yönetir (GRANT, REVOKE).
  • TCL (Transaction Control Language): DML işlemlerini yönetir (COMMIT, ROLLBACK, SAVEPOINT).
  • DQL (Data Query Language): Veritabanından veri çekmek için kullanılır (SELECT).

2.2 Veri Türleri (NUMBER, VARCHAR2, DATE vb.)

Veri türleri, tabloda bir sütunun hangi türde veri (sayı, metin, tarih vb.) saklayacağını ve bu verinin ne kadar yer kaplayacağını belirler. Oracle'ın en yaygın kullanılan veri türleri:

Temel Veri Türleri

Veri Tipi Açıklama Örnek Kullanım
**VARCHAR2(size)** Değişken uzunlukta metin verisi (Maks. 4000 byte). Veri ne kadar uzunsa o kadar yer kaplar. VARCHAR2(50)
**NUMBER(p, s)** Sayısal veri (p: toplam basamak, s: ondalık basamak sayısı). NUMBER(10, 2) (99999999.99)
**DATE** Tarih ve zaman bilgisi (gün, ay, yıl, saat, dakika, saniye). Sabit 7 byte yer kaplar. DATE
**CHAR(size)** Sabit uzunlukta metin verisi (Eğer metin kısaysa boşlukla doldurulur). CHAR(10)
**CLOB** Büyük metin blokları (4 GB'a kadar). CLOB

2.3 Temel SQL Komutları

Tüm sorguların ve işlemlerin temelini oluşturan en basit ve sık kullanılan SQL komutları şunlardır:

DQL Komutu: SELECT (Veri Çekme)

Veritabanından veri çekmek için kullanılır. En temel ve en çok kullanılan komuttur.

SELECT * FROM tablo_adı;

*: Tablodaki tüm sütunları getirir.

DML Komutları: INSERT, UPDATE, DELETE (Veri Değiştirme)

  • **INSERT:** Tabloya yeni bir kayıt ekler.
  • **UPDATE:** Var olan kayıtların verilerini değiştirir.
  • **DELETE:** Var olan kayıtları tablodan siler.

DDL Komutları: CREATE, ALTER, DROP (Nesne Yönetimi)

Veritabanı nesnelerini (tablo, indeks, view vb.) oluşturur, değiştirir veya siler.

2.4 SELECT, FROM, WHERE

Bu üç anahtar kelime, Oracle'da veri sorgulamanın temel yapısını (Minimum Sorgu Yapısı) oluşturur.

SELECT (Hangi Sütunlar?)

Hangi sütunları görüntülemek istediğinizi belirtir. Tek tek sütun adları virgülle ayrılır.

SELECT adı, soyadı, maaş FROM çalışanlar;

FROM (Hangi Tablodan?)

Verinin hangi tablodan çekileceğini belirtir. Tabloya ait şema adı (kullanıcı adı) ile kullanılabilir: şema_adı.tablo_adı

SELECT * FROM **robotikhocasi.müşteriler**;

WHERE (Hangi Koşulda?)

Sonuçları belirli bir koşula göre filtrelemek için kullanılır. Sadece koşulu sağlayan satırlar getirilir. Bu koşulda mantıksal ve karşılaştırma operatörleri kullanılır.

Örnek Kullanım: Maaşı 5000'den büyük olan çalışanları getir.

SELECT adı, maaş FROM çalışanlar **WHERE maaş > 5000;**

2.5 ORDER BY, GROUP BY, HAVING

Bu komutlar, sorgu sonuçlarını gruplamak ve sıralamak için kullanılır. Sorgulama sırasında işlem sırası önemlidir: FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

ORDER BY (Sıralama)

Sorgu sonucunu bir veya daha fazla sütuna göre sıralar. Sorgudaki en son uygulanan adımdır.

  • **ASC (Ascending):** Artan (A->Z veya 1->10). Varsayılandır.
  • **DESC (Descending):** Azalan (Z->A veya 10->1).

Örnek: Maaşı azalan, adı artan sırala.

SELECT * FROM çalışanlar ORDER BY maaş DESC, adı ASC;

GROUP BY (Gruplama)

Aynı değere sahip satırları tek bir grup halinde toplar. Sorgu listesinde (SELECT) küme (aggregate) fonksiyonu kullanıldığında, bu fonksiyonda olmayan tüm sütunlar GROUP BY içinde listelenmelidir.

Örnek: Departmanlara göre çalışan sayısını bul.

SELECT departman, COUNT(*) FROM çalışanlar **GROUP BY departman;**

HAVING (Grupları Filtreleme)

WHERE satırları filtrelerken, HAVING komutu **gruplanmış sonuçları** (yani küme fonksiyonu sonuçlarını) filtreler. Mutlaka GROUP BY'dan sonra kullanılmalıdır.

Örnek: Çalışan sayısı 5'ten fazla olan departmanları getir.

SELECT departman, COUNT(*) FROM çalışanlar GROUP BY departman **HAVING COUNT(*) > 5;**

2.6 Mantıksal Operatörler (AND, OR, NOT)

WHERE veya HAVING koşullarında birden fazla şartı birleştirmek veya tersine çevirmek için kullanılır. İşlem önceliği: **NOT > AND > OR**.

Operatör Açıklama Örnek Senaryo
**AND** Tüm koşullar doğru olmalıdır. Maaşı > 5000 **AND** Departmanı 'IT' olanlar.
**OR** Koşullardan en az biri doğru olmalıdır. Maaşı > 5000 **OR** Yaşı < 30 olanlar.
**NOT** Koşulun sonucunu tersine çevirir. Departmanı **'IT' olmayanlar**. (WHERE NOT departman = 'IT')

Örnek Kullanım:

SELECT * FROM çalışanlar WHERE (maaş > 7000 **AND** departman = 'Satış') **OR** departman = 'Muhasebe';

2.7 Karşılaştırma Operatörleri (=, >, <, BETWEEN, IN, LIKE)

WHERE koşullarında sütun değerlerini belirli değerlerle karşılaştırmak için kullanılırlar.

Operatör Açıklama
**=** Eşitlik (Metin veya sayısal).
**BETWEEN x AND y** x ve y (dahil) aralığındaki değerler.
**IN (değer1, değer2, ...)** Belirtilen listedeki herhangi bir değere eşit olanlar. Alternatifi çoklu OR kullanımıdır.
**LIKE** Desen eşleştirme (Wildcard karakterler: % ve _ ile).
**IS NULL** Değerin boş (NULL) olup olmadığını kontrol eder. Eşitlik operatörü (=) NULL için kullanılamaz.

LIKE Operatörü Detayı

  • %: Sıfır veya daha fazla karakteri temsil eder. (Örn: WHERE ad LIKE 'A%')
  • _ (alt çizgi): Tam olarak tek bir karakteri temsil eder. (Örn: WHERE telefon LIKE '53_%')

Örnek: Adı 'A' ile başlayan ve telefon numarası bilinmeyen çalışanlar.

SELECT ad, telefon FROM çalışanlar WHERE ad LIKE 'A%' AND telefon **IS NULL**;

2.8 Alias (Takma İsimler) Kullanımı

Alias, bir sütuna veya bir tabloya geçici olarak farklı bir isim (takma ad) vermeyi sağlar. Bu, sorgu sonuçlarının daha okunabilir olmasını ve karmaşık sorgularda nesneleri kısaltmayı sağlar.

Sütun Alias'ı

Sütun başlığını değiştirmek için kullanılır. AS kelimesi isteğe bağlıdır, ancak önerilir.

SELECT adı **AS Çalışan_Adı**, maaş * 12 YILLIK_MAAŞ FROM çalışanlar;

Not: Takma ad boşluk veya özel karakter içeriyorsa çift tırnak (") içine alınmalıdır.

Tablo Alias'ı

Özellikle JOIN'lerde ve alt sorgularda tablo adlarını kısaltmak için kullanılır. Tablo alias'ı zorunlu değildir ancak büyük sorgularda çok önemlidir.

SELECT **e**.adı, **d**.departman_adı FROM çalışanlar **e**, departmanlar **d** WHERE e.departman_id = d.id;

3.1 INSERT INTO — Veri Ekleme

INSERT INTO komutu, bir tabloya yeni satırlar (kayıtlar) eklemek için kullanılır.

1. Temel Tek Kayıt Ekleme

Sütun isimlerini açıkça belirtmek en güvenli yöntemdir.

INSERT INTO Çalışanlar (ÇalışanID, Adı, Maaş, DepartmanID)
VALUES (101, 'Ali', 7000, 10);

2. Başka Bir Tablodan Veri Ekleme (INSERT AS SELECT)

Bir sorgunun sonucunu doğrudan başka bir tabloya aktarmak için kullanılır.

INSERT INTO Arşiv_Çalışanlar (ÇalışanID, Adı, Maaş)
SELECT ÇalışanID, Adı, Maaş FROM Çalışanlar WHERE Ayrılma_Tarihi IS NOT NULL;

3.2 UPDATE — Veri Güncelleme

UPDATE komutu, bir tablodaki mevcut kayıtların verilerini değiştirmek için kullanılır. **WHERE koşulu hayati önem taşır.**

Temel UPDATE Söz Dizimi

UPDATE tablo_adı
SET sütun1 = yeni_değer1, sütun2 = yeni_değer2, ...
WHERE koşul;

Örnek Kullanım

  • Belirli Bir Kaydı Güncelleme:
  • UPDATE Çalışanlar SET Maaş = 7500 WHERE ÇalışanID = 101;
  • Birden Fazla Satırı Güncelleme:
  • UPDATE Çalışanlar SET Maaş = Maaş * 1.10 WHERE DepartmanID = 20; -- Maaşı %10 artır

3.3 DELETE — Veri Silme

DELETE komutu, tablodan bir veya daha fazla satırı silmek için kullanılır. Silinen veriler TCL (Transaction Control) komutlarıyla geri alınabilir.

Temel DELETE Söz Dizimi

DELETE FROM tablo_adı WHERE koşul;

Örnek Kullanım

  • Belirli Bir Kaydı Silme:
  • DELETE FROM Çalışanlar WHERE ÇalışanID = 102;
  • Tüm Kayıtları Silme (Geri Alınabilir):
  • DELETE FROM Çalışanlar;

⚠️ Önemli Not: DELETE işlemi kısıtlamaları (Constraints) kontrol eder ve işlem günlüklerine (Redo Log) kaydeder, bu da yavaş olmasına neden olabilir. Büyük tabloları boşaltmak için TRUNCATE (4.4) tercih edilir.

3.4 MERGE — Veri Birleştirme

MERGE (Upsert olarak da bilinir) komutu, bir kaynak tablodaki verileri tek bir DML ifadesiyle hedef tabloya hem **eklemek (INSERT)** hem de **güncellemek (UPDATE)** için kullanılır.

MERGE Kullanım Mantığı

MERGE, hedef (TARGET) ve kaynak (SOURCE) tabloları arasında bir eşleşme koşulu arar. Bu koşula göre:

  • WHEN MATCHED THEN UPDATE: Eşleşen satırlar güncellenir.
  • WHEN NOT MATCHED THEN INSERT: Eşleşmeyen satırlar eklenir.

Söz Dizimi (Basitleştirilmiş)

MERGE INTO hedef_tablo T
USING kaynak_tablo S ON (T.anahtar_sütun = S.anahtar_sütun)
WHEN MATCHED THEN
  UPDATE SET T.sütun = S.sütun
WHEN NOT MATCHED THEN
  INSERT (T.sütun1, T.sütun2) VALUES (S.sütun1, S.sütun2);

3.5 COMMIT, ROLLBACK, SAVEPOINT — İşlem Yönetimi (Transaction Control)

DML (INSERT, UPDATE, DELETE, MERGE) işlemleri birer **İşlem (Transaction)** olarak kabul edilir. TCL komutları, bu işlemlerin veritabanına kalıcı olarak kaydedilip kaydedilmeyeceğini veya geri alınıp alınmayacağını kontrol eder.

COMMIT (Kalıcı Kayıt)

Yapılan tüm DML işlemlerini veritabanına **kalıcı** olarak kaydeder. Bir kez COMMIT yapıldıktan sonra işlemler geri alınamaz (ROLLBACK).

COMMIT;

ROLLBACK (Geri Alma)

Son COMMIT işleminden bu yana yapılan tüm DML işlemlerini geri alır, yani değişiklikleri iptal eder.

ROLLBACK;

SAVEPOINT (Kaydetme Noktası)

İşlem içinde geçici bir işaret noktası oluşturur. ROLLBACK yaparken tüm işlemi değil, sadece bu noktadan sonraki değişiklikleri geri almayı sağlar.

  • Oluşturma: SAVEPOINT nokta_adı;
  • Geri Alma: ROLLBACK TO nokta_adı;

4.1 CREATE TABLE — Tablo Oluşturma

CREATE TABLE komutu, veritabanında bir tablo yapısı oluşturmak için kullanılır. Tablo, sütun adlarını, veri tiplerini ve isteğe bağlı olarak kısıtlamaları (constraints) tanımlar.

Temel Söz Dizimi

CREATE TABLE Çalışanlar (
  id NUMBER(6) PRIMARY KEY,
  adı VARCHAR2(50) NOT NULL,
  maaş NUMBER(8, 2) DEFAULT 0,
  kayıt_tarihi DATE
);

4.2 ALTER TABLE — Tablo Değiştirme

ALTER TABLE komutu, var olan bir tablonun yapısını değiştirmek için kullanılır (sütun ekleme, değiştirme, silme veya kısıtlama ekleme/silme).

Önemli Kullanım Şekilleri

  • Sütun Ekleme:
  • ALTER TABLE Çalışanlar ADD e_posta VARCHAR2(100);
  • Sütun Veri Tipini Değiştirme:
  • ALTER TABLE Çalışanlar MODIFY e_posta VARCHAR2(150);
  • Sütun Silme:
  • ALTER TABLE Çalışanlar DROP COLUMN kayıt_tarihi;
  • Kısıtlama Ekleme (5. Bölümde detaylı):
  • ALTER TABLE Çalışanlar ADD CONSTRAINT chk_maas CHECK (maaş > 0);

4.3 DROP TABLE — Tablo Silme

DROP TABLE komutu, veritabanından bir tablonun tüm yapısını ve içerdiği **tüm veriyi kalıcı olarak siler**. Bu bir DDL işlemi olduğu için **geri alınamaz (ROLLBACK edilemez)**.

DROP TABLE Çalışanlar CASCADE CONSTRAINTS;

CASCADE CONSTRAINTS: Eğer bu tabloya bağlı (FOREIGN KEY ile) başka tablolar varsa, bu bağımlı kısıtlamaları da otomatik olarak siler. Aksi takdirde Oracle hata verir.

4.4 TRUNCATE — Tabloyu Boşaltma

TRUNCATE TABLE komutu, tablonun **tüm verisini çok hızlı ve kalıcı olarak siler**, ancak tablo yapısını korur. Bir DDL komutudur ve geri alınamaz.

TRUNCATE vs. DELETE

Özellik TRUNCATE DELETE FROM
**Komut Tipi** DDL DML
**Geri Alınabilirlik** **Hayır** (Kalıcıdır) Evet (ROLLBACK edilebilir)
**Hız** **Çok hızlı** (Blokları serbest bırakır) Yavaş (Satır satır siler)
**WHERE Koşulu** Kullanılamaz (Tüm tablo silinir) Kullanılabilir

4.5 COMMENT — Açıklama Ekleme

COMMENT komutu, tablolar ve sütunlar hakkında açıklayıcı metinler eklemek için kullanılır. Bu metinler doğrudan veri sözlüğüne (Data Dictionary) kaydedilir ve kullanıcıların veya geliştiricilerin veritabanı yapısını anlamasına yardımcı olur.

Tabloya Açıklama Ekleme

COMMENT ON TABLE Çalışanlar IS 'Bu tablo, şirketteki tüm aktif çalışanların temel bilgilerini tutar.';

Sütuna Açıklama Ekleme

COMMENT ON COLUMN Çalışanlar.maaş IS 'Çalışanın aylık brüt maaşı (TL).';

4.6 RENAME — Nesne Yeniden Adlandırma

RENAME komutu, veritabanı nesnelerinin (Tablo, View, Index, Sequence) adını değiştirmek için kullanılır.

Tablo Adı Değiştirme

RENAME eski_tablo_adı TO yeni_tablo_adı;

Örnek:

RENAME Çalışanlar TO Personel;

5.1 NOT NULL

NOT NULL kısıtlaması, bir sütunun veri girilirken **boş (NULL)** bırakılamayacağını garanti eder. Veri bütünlüğünü sağlamanın en temel yoludur.

Tanımlama

Genellikle tablo oluşturulurken tanımlanır:

CREATE TABLE Müşteriler (id NUMBER, adı VARCHAR2(50) **NOT NULL**);

5.2 UNIQUE

UNIQUE kısıtlaması, bir sütundaki (veya sütun kombinasyonundaki) değerlerin her satır için **benzersiz** olmasını sağlar. Bu, NULL değerlerin girilmesini engellemez; birden fazla NULL değer kabul edilir.

Tanımlama

CREATE TABLE Çalışanlar (e_posta VARCHAR2(100) **UNIQUE**);

5.3 PRIMARY KEY (PK)

PRIMARY KEY (Birincil Anahtar) kısıtlaması, bir tablodaki her satırı benzersiz bir şekilde tanımlar. Bir tabloda sadece bir tane PK olabilir.

PK'nın Özellikleri

  • Hem **UNIQUE** hem de **NOT NULL** kısıtlamalarını otomatik olarak içerir.
  • Veri sorgulamasını hızlandırmak için otomatik olarak bir index oluşturur.

Tanımlama

CREATE TABLE Ürünler (ÜrünID NUMBER **PRIMARY KEY**, adı VARCHAR2(50));

5.4 FOREIGN KEY (FK)

FOREIGN KEY (Yabancı Anahtar) kısıtlaması, iki tablo arasındaki ilişkiyi kurar ve veri bütünlüğünü sağlar. Bir tablodaki FK, başka bir tablonun PK'sına (veya UNIQUE sütununa) referans verir.

Kural

FK sütununa eklenen her değer, referans gösterdiği (ana) tablonun PK sütununda **mutlaka var olmalıdır**.

Tanımlama

CREATE TABLE Çalışanlar (
  ...
  DepartmanID NUMBER,
  CONSTRAINT fk_departman **FOREIGN KEY** (DepartmanID) **REFERENCES** Departmanlar(ID)
);

Silme Kısıtlamaları (ON DELETE)

  • **ON DELETE CASCADE:** Eğer ana tablodan bir satır silinirse, bağımlı tablodaki ilgili satırlar da otomatik silinir.
  • **ON DELETE SET NULL:** Eğer ana tablodan bir satır silinirse, bağımlı tablodaki FK sütunu NULL olarak ayarlanır.

5.5 CHECK

CHECK kısıtlaması, bir sütuna eklenecek değerin belirli bir koşulu (mantıksal ifadeyi) sağlamasını zorunlu kılar. Bu, iş mantığı kurallarını veritabanı düzeyinde uygulamayı sağlar.

Tanımlama

CREATE TABLE Çalışanlar (
  maaş NUMBER,
  cinsiyet CHAR(1) CONSTRAINT chk_cinsiyet **CHECK (cinsiyet IN ('E', 'K'))**
  CONSTRAINT chk_maas **CHECK (maaş > 5000)**
);

5.6 Kısıtlamaların Görüntülenmesi ve Yönetimi

Kısıtlamalar veri sözlüğü görünümlerinde (Data Dictionary Views) saklanır ve bu görünümler üzerinden yönetilir.

Kısıtlamaları Görüntüleme

Tüm kullanıcı kısıtlamalarını görmek için en yaygın kullanılan görünüm şudur:

SELECT constraint_name, constraint_type, table_name, status
FROM user_constraints
WHERE table_name = 'ÇALIŞANLAR';

constraint_type değerleri: P (Primary Key), R (Foreign Key), U (Unique), C (Check veya Not Null).

Kısıtlamaları Yönetme (Devre Dışı Bırakma/Etkinleştirme)

  • **Devre Dışı Bırakma:** DML işlemleri sırasında kısıtlama kontrolünü atlamak için kullanılır (Büyük veri yüklemelerinde performansı artırır).
  • ALTER TABLE Çalışanlar DISABLE CONSTRAINT fk_departman;
  • **Etkinleştirme:** Kısıtlamayı tekrar devreye sokar.
  • ALTER TABLE Çalışanlar ENABLE CONSTRAINT fk_departman;

6.1 INNER JOIN

INNER JOIN (İç Birleştirme), iki veya daha fazla tablonun birleşim koşulunu (JOIN Condition) sağlayan **ortak** satırlarını döndürür. En yaygın kullanılan JOIN türüdür.

Söz Dizimi

SELECT e.ad, d.departman_ad
FROM çalışanlar e
**INNER JOIN** departmanlar d ON e.departman_id = d.id;

Sonuç: Yalnızca hem çalışan tablosunda kaydı olan, hem de geçerli bir departman ID'sine sahip olan çalışanları getirir.

6.2 LEFT JOIN

LEFT OUTER JOIN (Sol Dış Birleştirme), sol taraftaki tablonun (FROM sonrası) **tüm** satırlarını ve sağ tablo ile eşleşen satırları döndürür. Sol tabloda eşleşmeyen satırlar için sağ tablonun sütunları NULL değerini alır.

Söz Dizimi

SELECT e.ad, d.departman_ad
FROM çalışanlar e
**LEFT JOIN** departmanlar d ON e.departman_id = d.id;

Sonuç: Tüm çalışanları getirir. Eğer bir çalışanın departmanı yoksa (departman_id NULL ise veya departmanlar tablosunda yoksa), departman_ad sütunu NULL olacaktır.

6.3 RIGHT JOIN

RIGHT OUTER JOIN (Sağ Dış Birleştirme), sol JOIN'in tersidir. Sağ taraftaki tablonun (JOIN sonrası) **tüm** satırlarını ve sol tablo ile eşleşen satırları döndürür. Sağ tabloda eşleşmeyen satırlar için sol tablonun sütunları NULL değerini alır.

Söz Dizimi

SELECT e.ad, d.departman_ad
FROM çalışanlar e
**RIGHT JOIN** departmanlar d ON e.departman_id = d.id;

Sonuç: Tüm departmanları getirir. Eğer bir departmanda hiç çalışan yoksa, e.ad sütunu NULL olacaktır.

6.4 FULL OUTER JOIN

FULL OUTER JOIN (Tam Dış Birleştirme), hem sol hem de sağ tablodaki tüm satırları döndürür. Eğer bir tablonun satırı diğer tabloda eşleşmiyorsa, diğer tablonun sütunları için NULL değeri döndürülür.

Söz Dizimi

SELECT e.ad, d.departman_ad
FROM çalışanlar e
**FULL OUTER JOIN** departmanlar d ON e.departman_id = d.id;

Sonuç: Hem departmanı olmayan çalışanları, hem de çalışanı olmayan departmanları getirir.

6.5 CROSS JOIN

CROSS JOIN (Kartezyen Çarpım), bir tablodaki her satırı diğer tablonun her satırıyla birleştirir. İlişki koşulu (ON) belirtilmez.

Kullanımı

Genellikle iki tablonun tüm olası kombinasyonlarını oluşturmak veya test senaryoları için kullanılır. Büyük tablolarda performansı ciddi şekilde düşürebilir.

Söz Dizimi

SELECT e.ad, d.departman_ad
FROM çalışanlar e
**CROSS JOIN** departmanlar d;

Sonuç: (Çalışan sayısı) x (Departman sayısı) kadar satır getirir.

6.6 SELF JOIN

SELF JOIN (Kendi Kendine Birleştirme), bir tablonun kendisine katılmasıdır. Tablodaki satırları tablonun diğer satırlarıyla ilişkilendirmek gerektiğinde kullanılır (örneğin, hiyerarşik verilerde).

Kullanım Senaryosu

Çalışanlar tablosunda, bir çalışanın yöneticisinin de o tablonun içinde olduğu durumlarda (YöneticiID sütunu ÇalışanID sütununa referans verdiğinde) kullanılır.

Söz Dizimi

SELECT **y**.ad AS Yönetici_Adı, **e**.ad AS Çalışan_Adı
FROM çalışanlar **e**
INNER JOIN çalışanlar **y** ON e.yönetici_id = y.id;

Bu sorguda 'e' çalışanları, 'y' ise yöneticileri temsil eder.

6.7 Alt Sorgular (Subqueries)

Alt sorgu (Subquery veya İç Sorgu), başka bir SQL sorgusunun içine gömülmüş bir SELECT ifadesidir. Alt sorgu, ana sorguya bir değer (veya değer kümesi) döndürerek filtreleme veya karşılaştırma sağlar.

Kullanım Alanları

  • WHERE Koşulunda: Bir sütunu, alt sorgunun döndürdüğü tek bir değerle veya bir değer listesiyle karşılaştırmak (en yaygın).
  • FROM Koşulunda (Inline View): Alt sorgu sonucunu geçici bir tablo (View) gibi kullanmak.
  • SELECT Koşulunda (Scalar Subquery): Her bir satır için tek bir değer döndürmek.

Örnek (WHERE Koşulunda)

Ortalama maaştan daha yüksek maaş alan çalışanları bul:

SELECT ad, maaş FROM çalışanlar
WHERE maaş > (SELECT AVG(maaş) FROM çalışanlar);

6.8 Çoklu Tablo Sorguları

Oracle'da birden fazla tablodan veri çekmek için hem modern **JOIN söz dizimi** (6.1-6.6) hem de eski **virgülle ayırma (ANSI/Oracle 8i öncesi)** söz dizimi kullanılabilir.

1. JOIN Söz Dizimi (Tercih Edilen)

İlişki koşulu ON anahtar kelimesiyle JOIN ifadesinin içinde belirtilir, okunabilirliği artırır.

SELECT e.ad, d.departman_ad
FROM çalışanlar e JOIN departmanlar d ON e.departman_id = d.id;

2. Virgülle Ayırma Söz Dizimi (Eski Yöntem)

Tablolar FROM ifadesinde virgülle ayrılır, ilişki koşulu ise WHERE ifadesinde belirtilir.

SELECT e.ad, d.departman_ad
FROM çalışanlar e, departmanlar d
WHERE e.departman_id = d.id;

Uyarı: Bu yöntemde WHERE koşulu unutulursa, istenmeyen bir **CROSS JOIN** (Kartezyen Çarpım) oluşur.

7.1 Sayısal Fonksiyonlar (ROUND, TRUNC, MOD)

Sayısal veriler üzerinde matematiksel işlemler yapmak için kullanılırlar. Tek satır (Scalar) fonksiyonlardır, yani her satır için bir sonuç üretirler.

Fonksiyon Amaç Örnek Sonuç
**ROUND(n, p)** Sayının 'p' basamağa yuvarlanması. ROUND(12.345, 2) 12.35
**TRUNC(n, p)** Sayının 'p' basamaktan sonra kesilmesi. TRUNC(12.345, 2) 12.34
**MOD(m, n)** m'nin n'ye bölümünden kalanı verir. MOD(10, 3) 1
**ABS(n)** Sayının mutlak değeri. ABS(-15) 15

7.2 Karakter Fonksiyonları (UPPER, LOWER, SUBSTR, INSTR)

Metin verileri üzerinde işlem yapmak ve formatlamak için kullanılırlar. (Tek satır fonksiyonlardır.)

Fonksiyon Amaç Örnek Sonuç
**UPPER(char)** Metni büyük harfe çevirir. UPPER('ali') ALI
**LOWER(char)** Metni küçük harfe çevirir. LOWER('AYŞE') ayşe
**SUBSTR(char, m, n)** m'den başlayarak n kadar karakteri döndürür. SUBSTR('Oracle', 3, 2) ac
**INSTR(char, aranan)** Metin içindeki aranan karakterin konumunu döndürür. INSTR('Oracle', 'c') 3
**LENGTH(char)** Metnin uzunluğunu döndürür. LENGTH('SQL') 3

7.3 Tarih Fonksiyonları (SYSDATE, MONTHS_BETWEEN, ADD_MONTHS)

Oracle'da tarih ve zaman verileri üzerinde hesaplamalar yapmak ve tarihleri manipüle etmek için kullanılır.

Fonksiyon Amaç Örnek
**SYSDATE** Sistemin güncel tarih ve zamanını döndürür. SELECT SYSDATE FROM DUAL;
**MONTHS_BETWEEN(d1, d2)** İki tarih arasındaki ay farkını döndürür. MONTHS_BETWEEN('01-OCAK-2024', '01-OCAK-2023')
**ADD_MONTHS(d, n)** Verilen tarihe 'n' ay ekler. ADD_MONTHS(SYSDATE, 3)
**LAST_DAY(d)** Verilen ayın son gününü döndürür. LAST_DAY(SYSDATE)

DUAL Tablosu: Oracle'da herhangi bir tablodan veri çekmek istemediğinizde (örneğin sadece bir fonksiyonun sonucunu görmek için) kullanılan sanal bir tablodur.

7.4 Dönüştürme Fonksiyonları (TO_CHAR, TO_DATE, TO_NUMBER)

Veri tipleri arasında geçiş yapmak için kullanılırlar. (Örn: Tarihi metne, metni sayıya çevirme).

1. TO_CHAR (Tarih/Sayıyı Metne Çevirme)

Tarih veya sayısal veriyi okunabilir bir formatta metne dönüştürür.

SELECT **TO_CHAR**(SYSDATE, 'DD/MM/YYYY HH24:MI:SS') FROM DUAL;

2. TO_DATE (Metni Tarihe Çevirme)

Bir metin dizisini Oracle'ın DATE veri tipine dönüştürür. Format belirtmek zorunludur.

SELECT **TO_DATE**('25.10.2024', 'DD.MM.YYYY') FROM DUAL;

3. TO_NUMBER (Metni Sayıya Çevirme)

Sayısal bir metin dizisini NUMBER veri tipine dönüştürür.

SELECT **TO_NUMBER**('12345') + 10 FROM DUAL;

7.5 Koşullu İfadeler (CASE, DECODE)

Sorgu içinde if-else mantığı yürütmek için kullanılırlar. Çıktı formatını veri içeriğine göre değiştirmeyi sağlarlar.

1. CASE İfadesi (ANSI Standardı)

Daha esnek, okunabilir ve modern bir yaklaşımdır. Birden fazla koşul için kullanılabilir.

SELECT ad, maaş,
  **CASE**
    WHEN maaş > 10000 THEN 'Yüksek Gelir'
    WHEN maaş BETWEEN 5000 AND 10000 THEN 'Orta Gelir'
    ELSE 'Düşük Gelir'
  **END** AS Gelir_Seviyesi
FROM çalışanlar;

2. DECODE Fonksiyonu (Oracle Özel)

Daha az esnektir, sadece tek bir sütunun değerine göre eşitlik kontrolü yapar. Eski Oracle sürümlerinde yaygındır.

SELECT ad, DepartmanID,
  **DECODE**(DepartmanID, 10, 'IT', 20, 'Satış', 'Diğer') AS Departman_Adı
FROM çalışanlar;

8.1 CREATE VIEW

Görünüm (View), bir veya daha fazla tablodan çekilen veriler üzerinde tanımlanmış **sanal bir tablodur**. Veriyi fiziksel olarak depolamaz, sadece temel bir sorguyu (query) saklar.

Kullanım Amaçları

  • Güvenlik: Kullanıcılara sadece belirli sütunlara veya satırlara erişim izni vermek.
  • Karmaşıklığı Gizleme: Karmaşık JOIN'leri veya hesaplamaları tek, basit bir tablo gibi sunmak.
  • Kolaylık: Sık kullanılan sorguları kaydetmek.

Söz Dizimi

**CREATE VIEW** Satış_Personeli_Görünümü **AS**
SELECT ad, soyad, maaş FROM çalışanlar
WHERE departman = 'Satış';

8.2 REPLACE VIEW

Var olan bir görünümün tanımını (temelindeki sorguyu) silmeden değiştirmek için kullanılır. Eğer görünüm yoksa, yeni bir görünüm oluşturur.

Söz Dizimi

CREATE OR REPLACE VIEW, görünümü ilk kez oluştururken veya mevcut tanımını değiştirirken aynı anda kullanılabilir, bu da geliştirme sırasında pratiktir.

**CREATE OR REPLACE VIEW** Satış_Personeli_Görünümü AS
SELECT ad, soyad, e_posta, maaş * 12 AS Yıllık_Maaş FROM çalışanlar
WHERE departman = 'Satış';

8.3 DROP VIEW

Veritabanından bir görünümü silmek için kullanılır. Temel tabloların kendisi veya verileri silinmez.

Söz Dizimi

**DROP VIEW** Satış_Personeli_Görünümü;

8.4 Materyalize Görünümler (Materialized Views)

Materyalize Görünüm (MV), normal görünümlerin aksine, temel sorgunun sonucunu **fiziksel olarak veritabanında saklar**. Genellikle veri ambarı (Data Warehouse) ve raporlama sistemlerinde, karmaşık sorguların performansını artırmak için kullanılır.

Temel Fark

  • **View (Görünüm):** Sorgulandığında veriyi temel tablolardan anlık olarak çeker. (Sanal)
  • **Materialized View (MV):** Veriyi diskte depolar ve periyodik olarak güncellenir (Refresh). (Fiziksel)

MV Avantajları

  • Çok karmaşık ve zaman alıcı JOIN/GROUP BY işlemlerinin sonucunu önceden hesaplar.
  • Sorgulama, MV'den okuma yaptığı için çok hızlıdır.

MV Oluşturma (Basit)

CREATE MATERIALIZED VIEW MV_Toplam_Satis AS
SELECT urun_id, SUM(miktar) AS Toplam_Miktar
FROM Satışlar GROUP BY urun_id;

9.1 PL/SQL Nedir?

PL/SQL (Procedural Language/SQL), Oracle tarafından geliştirilen, SQL'i prosedürel programlama dillerinin (koşullu mantık, döngüler, değişkenler) gücüyle birleştiren bir dildir. Veritabanı içinde yürütülebilen kod blokları (Stored Procedures, Functions, Triggers) oluşturmayı sağlar.

Temel Fark: SQL vs. PL/SQL

Özellik SQL PL/SQL
**Amaç** Veri Sorgulama ve Manipülasyon (Deklaratif) Programlama Mantığı Uygulama (Prosedürel)
**Temel Yapı** Tek Komutlar (SELECT, INSERT, vb.) Kod Blokları, Değişkenler, Döngüler, Koşullar

9.2 Blok Yapısı (DECLARE, BEGIN, EXCEPTION, END)

PL/SQL kodu, anonim bloklar veya adlandırılmış bloklar (Procedure, Function) halinde yazılır. Her anonim blok 3 ana bölümden oluşur, sadece BEGIN ve END zorunludur.

PL/SQL Blok Yapısı

  1. **DECLARE (İsteğe Bağlı):** Değişkenlerin, sabitlerin ve cursor'ların tanımlandığı alandır.
  2. **BEGIN (Zorunlu):** Kodun yürütüleceği, SQL ve prosedürel komutların yer aldığı alandır.
  3. **EXCEPTION (İsteğe Bağlı):** Çalışma zamanı hatalarının (runtime errors) yakalanıp ele alındığı alandır.
  4. **END (Zorunlu):** Bloğu sonlandırır.

Örnek Anonim Blok

**DECLARE**
  v_ad VARCHAR2(50);

**BEGIN**
  SELECT ad INTO v_ad FROM çalışanlar WHERE id = 101;
  DBMS_OUTPUT.PUT_LINE('Çalışan Adı: ' || v_ad);

**EXCEPTION**
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('Hata: Çalışan bulunamadı.');

**END;**
/

9.3 Değişkenler ve Sabitler

PL/SQL, veri depolamak ve değerleri programatik olarak değiştirmek için değişkenler ve sabitler kullanır.

Değişken Tanımlama

Bir değişken tanımlarken adını, veri tipini ve isteğe bağlı olarak başlangıç değerini belirtiriz. Oracle veri tipleri kullanılır.

v_sayi NUMBER(10) **DEFAULT** 0;
v_tarih DATE **:=** SYSDATE;

%TYPE ve %ROWTYPE Nitelikleri

  • **%TYPE:** Bir değişkenin veri tipini bir tablonun belirli bir sütununun veri tipiyle eşleştirir. Bu, tablonun yapısı değişse bile kodun korunmasını sağlar.
  • v_ad **çalışanlar.ad%TYPE**;
  • **%ROWTYPE:** Bir değişkenin veri tipini tablonun tüm satırının yapısıyla (tüm sütunlarıyla) eşleştirir.
  • r_çalışan_kaydı **çalışanlar%ROWTYPE**;

Sabit Tanımlama

Değeri blok boyunca değiştirilemeyen değişkenlerdir.

c_oran **CONSTANT** NUMBER(5,2) := 0.15;

9.4 Kontrol Yapıları (IF, CASE, LOOP, FOR, WHILE)

PL/SQL kodunun akışını yönetmek ve koşullu mantık veya tekrarlayan işlemler uygulamak için kullanılırlar.

1. Koşullu İfadeler

  • **IF-THEN-ELSE:** Klasik koşullu kontrol.
  • IF maaş < 5000 THEN
      v_seviye := 'Düşük';
    ELSIF maaş >= 10000 THEN
      v_seviye := 'Yüksek';
    ELSE
      v_seviye := 'Orta';
    END IF;
  • **CASE:** Çoklu koşullar için kullanılır. (SQL'deki CASE ile benzerdir.)

2. Döngü Yapıları

  • **BASIC LOOP:** En basit döngü, EXIT WHEN ile sonlandırılır.
  • **WHILE LOOP:** Döngüye girmeden önce koşulu kontrol eder.
  • WHILE sayac <= 10 LOOP
      sayac := sayac + 1;
    END LOOP;
  • **FOR LOOP:** Belirli bir sayı aralığında veya bir CURSOR'dan otomatik döner. En sık kullanılanıdır.
  • FOR i IN 1..10 LOOP
      -- 1'den 10'a döner
    END LOOP;

9.5 Hataların Yönetimi (EXCEPTION Handling)

PL/SQL bloğunun EXCEPTION kısmı, kodun normal akışını bozan çalışma zamanı hatalarını (runtime errors) yakalamak ve zarifçe ele almak için kullanılır. Bu, uygulamanın çökmesini engeller.

Hata Türleri

  • **Önceden Tanımlı Hatalar:** Oracle tarafından adı belirlenmiş yaygın hatalardır (Örn: NO_DATA_FOUND, TOO_MANY_ROWS, DUP_VAL_ON_INDEX).
  • **Tanımlı Olmayan Hatalar:** Nadir veya özel hatalardır, OTHERS anahtar kelimesiyle yakalanabilir.

EXCEPTION Bölümü Örneği

BEGIN
  ...
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('Aranan veri bulunamadı.');
  WHEN TOO_MANY_ROWS THEN
    DBMS_OUTPUT.PUT_LINE('Birden fazla satır döndü.');
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Bilinmeyen bir hata oluştu: ' || SQLERRM);
END;

9.6 PL/SQL ile SQL Komutları

PL/SQL'in gücü, prosedürel mantığı veritabanı manipülasyonu (DML) ve sorgulama (DQL) ile birleştirmesinden gelir. Buna **SQL Entegrasyonu** denir.

DML Komutları (INSERT, UPDATE, DELETE)

DML komutları PL/SQL bloğu içinde doğrudan kullanılabilir. Değişkenler, değerleri dinamik olarak atamak için kullanılır.

UPDATE çalışanlar SET maaş = v_yeni_maas WHERE id = v_id;

DQL Komutu (SELECT INTO)

SELECT komutu PL/SQL içinde doğrudan sonuç kümesi döndüremez. Tek bir satırın sonucunu bir değişkene atamak için **INTO** anahtar kelimesi kullanılmalıdır.

Kural: SELECT INTO her zaman **tek bir satır** döndürmelidir.

SELECT maaş, departman_id
INTO v_maas, v_departman
FROM çalışanlar WHERE id = v_id_parametre;

Eğer sorgu sıfır satır döndürürse `NO_DATA_FOUND`, birden fazla satır döndürürse `TOO_MANY_ROWS` hatası oluşur (EXCEPTION ile yönetilir).

10.1 Fonksiyonlar (CREATE FUNCTION)

PL/SQL Fonksiyonları, belirli bir hesaplama veya mantık işlemini gerçekleştiren ve **mutlaka tek bir değer döndüren** adlandırılmış program bloklarıdır. SQL sorgularının içinde kullanılabilirler.

Temel Özellikler

  • Her zaman bir RETURN ifadesi içermelidir.
  • DML (INSERT, UPDATE, DELETE) işlemlerini içerebilir, ancak DML içeren fonksiyonlar doğrudan SELECT sorgularında kullanılamaz.

Söz Dizimi

CREATE FUNCTION fn_yillik_maas (p_aylik_maas IN NUMBER) **RETURN NUMBER**
IS
BEGIN
  RETURN p_aylik_maas * 12;
END;

10.2 Prosedürler (CREATE PROCEDURE)

PL/SQL Prosedürleri, bir dizi işlemi (iş mantığını) gerçekleştiren adlandırılmış program bloklarıdır. Fonksiyonların aksine, **değer döndürmek zorunda değildirler**, ancak parametreler aracılığıyla sonuç döndürebilirler.

Temel Özellikler

  • Genellikle DML (veri değiştirme) işlemlerini gerçekleştirmek için kullanılırlar.
  • Prosedürler, SQL sorgularında kullanılamaz, ancak diğer prosedürler, fonksiyonlar veya dış uygulamalar tarafından çağrılabilirler.

Söz Dizimi

CREATE PROCEDURE prc_maas_artir (
  p_id IN NUMBER, **p_oran IN NUMBER**
)
IS
BEGIN
  UPDATE çalışanlar SET maaş = maaş * (1 + p_oran) WHERE id = p_id;
  COMMIT;
END;

IN, OUT, IN OUT Parametre Modları:

  • **IN:** Sadece prosedüre değer sağlar (Varsayılan).
  • **OUT:** Prosedürden çağıran ortama değer döndürür.
  • **IN OUT:** Hem değer sağlar hem de sonuç döndürür.

10.3 Paketler (Packages)

Paketler, birbiriyle ilgili PL/SQL fonksiyonlarını, prosedürleri, değişkenleri, tipleri ve cursor'ları tek bir mantıksal birimde gruplamak için kullanılan veritabanı nesneleridir.

Paketlerin Yapısı

Her paket iki ayrı bileşenden oluşur:

  1. **Package Specification (Tanımlama):** Paketin dışarıya açık olan arayüzünü tanımlar (public functions/procedures listesi). (Ne yapar?)
  2. **Package Body (Gövde):** Tanımlamada belirtilen nesnelerin asıl kodunu (mantığını) içerir. Ayrıca sadece paketin içinde kullanılan özel (private) nesneleri de içerir. (Nasıl yapar?)

Paket Kullanımının Avantajları

  • Modülerlik: İlişkili kodları bir arada tutar.
  • Performans: Paket ilk çağrıldığında belleğe (SGA) yüklenir ve sonraki çağrılar için önbellekte kalır.
  • Gizleme (Encapsulation): İş mantığını gizleyebilir (sadece Specification'ı yayınlayarak).

10.4 Trigger’lar

Trigger (Tetikleyici), bir tabloda veya bir veritabanı olayı (örneğin: DML işlemleri, logon/logoff, DDL işlemleri) gerçekleştiğinde otomatik olarak yürütülen adlandırılmış PL/SQL bloklarıdır.

Trigger Çeşitleri (Zaman ve Seviyeye Göre)

  • **Zamanlama (Timing):**
    • **BEFORE:** Olay gerçekleşmeden önce (Örn: Veri eklenmeden önce kimlik kontrolü).
    • **AFTER:** Olay gerçekleştikten sonra (Örn: Veri silindikten sonra loglama).
  • **Seviye (Level):**
    • **ROW Level (FOR EACH ROW):** Etkilenen her bir satır için çalışır. En sık kullanılanıdır.
    • **STATEMENT Level:** DML komutunun tamamı için bir kez çalışır.

Örnek (AFTER INSERT Trigger)

Yeni bir çalışan eklendiğinde log tutar:

CREATE TRIGGER trg_calisan_ekle_log
**AFTER INSERT ON çalışanlar FOR EACH ROW**
BEGIN
  INSERT INTO işlem_logları (açıklama) VALUES ('Yeni çalışan eklendi: ' || :NEW.ad);
END;

**:NEW** ve **:OLD** referansları, satır seviyesinde tetikleyicilerde, sırasıyla eklenen/güncellenen yeni değerlere ve silinen/güncellenen eski değerlere erişimi sağlar.

10.5 Cursor Kullanımı

Cursor (İmleç), birden fazla satır döndüren bir SQL sorgusunun sonucunu işlemek için kullanılan bir bellek alanıdır (Pointer). PL/SQL, sonuç kümesini tek tek satır satır işlemek için cursor'ları kullanır.

Cursor Türleri

  • **Implicit Cursor (Örtülü):** Oracle tarafından arka planda otomatik yönetilir (Örn: SELECT INTO veya DML işlemleri).
  • **Explicit Cursor (Açık):** Geliştirici tarafından tanımlanır, açılır (OPEN), veriler çekilir (FETCH) ve kapatılır (CLOSE).

Açık Cursor Adımları

  1. **DECLARE:** Cursor'ı tanımla (CURSOR c_calisan IS SELECT...).
  2. **OPEN:** Sorguyu yürüt ve sonuç kümesini yükle.
  3. **FETCH:** Sonuç kümesinden bir satırı çek ve PL/SQL değişkenlerine atama yap.
  4. **CLOSE:** Bellek alanını serbest bırak.

İpucu: Basit döngülerde, FOR...IN cursor_adı LOOP kullanımı, OPEN, FETCH ve CLOSE işlemlerini otomatik olarak yapar.

10.6 Kayıt Tipleri (Records)

Record (Kayıt), farklı veri tiplerine sahip sütunları tek bir mantıksal birim altında gruplamak için kullanılan bileşik bir veri tipidir. Bir tablonun bir satırını veya bir sorgu sonucunu temsil etmek için idealdir.

Kullanım Türleri

  • **%ROWTYPE:** Bir tablonun satır yapısını miras alır (En sık kullanılan).
  • r_calisan çalışanlar%ROWTYPE;
  • **USER-DEFINED Record:** Geliştiricinin kendi belirlediği alanlardan oluşur.
  • TYPE t_adres IS RECORD (
      sokak VARCHAR2(100),
      şehir VARCHAR2(50)
    );
    v_adres t_adres;

Kayıt alanlarına erişim: r_calisan.ad veya v_adres.şehir.

10.7 Koleksiyonlar (Arrays, Varrays, Nested Tables)

Koleksiyonlar, aynı veri tipine sahip birden çok öğeyi tek bir değişken içinde depolamak için kullanılırlar. PL/SQL'deki dizi yapılarıdır.

Koleksiyon Türleri

Tip Açıklama
**Varray (Variable-Size Array)** Öğelerin sırası önemlidir. Tanımlanırken maksimum eleman sayısı belirlenmelidir.
**Nested Table (İç İçe Tablo)** Esnek boyuttadır (maksimum boyutu yoktur). Diziyi veritabanı tablolarında sütun olarak saklamak için de kullanılabilir.
**Associative Array (Index-by Table)** Indexleme için sayısal (INTEGER) veya metin (VARCHAR2) anahtarlar kullanılabilir. Veritabanı sütunu olarak kullanılamaz.

Kullanım Örneği (Nested Table)

TYPE t_maas_listesi IS TABLE OF çalışanlar.maaş%TYPE;
v_maaslar t_maas_listesi := t_maas_listesi();

11.1 Diziler (Sequences)

Sequence (Dizi), otomatik olarak artan benzersiz tamsayılar üretmek için kullanılan veritabanı nesnesidir. Genellikle, tabloların Birincil Anahtar (Primary Key) sütunlarına benzersiz ID'ler sağlamak için kullanılır.

Oluşturma Söz Dizimi

CREATE SEQUENCE seq_urun_id
INCREMENT BY 1
START WITH 1000
MAXVALUE 999999
NOCACHE
NOCYCLE;

Kullanım

  • **NEXTVAL:** Dizinin bir sonraki değerini döndürür (Değer üreterek artırır).
  • **CURRVAL:** Dizinin o oturumda en son üretilen değerini döndürür.
INSERT INTO Ürünler (id, ad) VALUES (**seq_urun_id.NEXTVAL**, 'Yeni Ürün');

11.2 Sözlük Görünümleri (Data Dictionary Views)

Veri Sözlüğü, veritabanının kendi yapısı hakkında bilgi depolayan, veritabanı tarafından yönetilen bir tablo ve görünüm koleksiyonudur. DBA'lar ve geliştiriciler, nesneler, izinler, kullanıcılar ve performans bilgileri hakkında sorgulama yapmak için bu görünümleri kullanır.

Temel Görünüm Ön Ekleri

Sözlük görünümleri üç ana ön ekle gruplanır:

Ön Ek Kapsam Örnek
**USER_** Sadece mevcut kullanıcının (şemanın) sahip olduğu nesneler. USER_TABLES, USER_VIEWS
**ALL_** Kullanıcının erişim izni olduğu tüm nesneler (kendi şemasındakiler ve diğer şemalardakiler). ALL_OBJECTS
**DBA_** Veritabanındaki tüm nesneler (Sadece DBA yetkisine sahip kullanıcılar erişebilir). DBA_DATA_FILES

Örnek Sorgu:

SELECT table_name, num_rows FROM user_tables;

11.3 Tablespace ve Segment Kavramı

Bu kavramlar, veritabanının fiziksel depolama yönetimini sağlar.

Tablespace (Mantıksal Depolama Birimi)

Tablespace, veritabanının mantıksal bir depolama birimidir. Veri dosyalarını (Datafiles) gruplar. Kullanıcı şemaları, tablolar, indexler gibi nesneler bir Tablespace içinde yaratılır.

  • **Kullanım Amacı:** Farklı türdeki verileri (örneğin: işlem verisi, index verisi, geçici veri) farklı fiziksel depolama alanlarında yönetmek ve I/O performansını optimize etmek.
  • **Sistem Tablespace'leri:** SYSTEM, SYSAUX, UNDO, TEMP.

Segment (Fiziksel Depolama Birimi)

Segment, veritabanı nesnelerinin (tablolar, indexler, rollback verisi) diskte kapladığı fiziksel alandır. Bir segment, bir veya daha fazla **Extent**'ten oluşur.

11.4 Veritabanı Dosyaları (Datafile, Controlfile, Redo Log)

Oracle Veritabanı, veriyi ve durum bilgisini üç ana dosya türünde saklar:

1. Datafiles (.dbf)

Tüm kullanıcı verilerini (tablolar, indexler vb.) tutan temel fiziksel dosyalardır. Her bir Datafile, tek bir Tablespace'e aittir.

2. Control Files

Veritabanının fiziksel yapısı (diğer Datafile ve Redo Log dosyalarının isimleri ve konumları), veritabanının mevcut durumu ve kurtarma bilgileri gibi kritik bilgileri tutan küçük ikili dosyalardır. Çok önemlidirler ve kaybolmaları durumunda veritabanı başlatılamaz.

En iyi uygulama: Güvenlik için birden fazla Control File kopyasını farklı disklere yerleştirmek.

3. Redo Log Files (Online Redo Log)

Veritabanında yapılan **tüm değişiklikleri** kronolojik olarak kaydeden dosyalardır. Kurtarma (Recovery) işlemleri için hayati öneme sahiptirler. Bir işlem (Transaction) kalıcı olarak kaydedilmeden (COMMIT edilmeden) önce, değişiklikler Redo Log dosyasına yazılır.

Redo Log dosyaları dairesel olarak kullanılır (Group 1 -> Group 2 -> Group 3 -> Group 1...).

11.5 Yedekleme Mantığı

Oracle yedekleme ve kurtarma mekanizması, veri kaybını önlemek ve veritabanını belirli bir zaman noktasına geri yüklemek için tasarlanmıştır. Bu mantık, **ARCHIVELOG modu** ve **RMAN** (Recovery Manager) üzerine kuruludur.

ARCHIVELOG Modu

Bu mod etkinleştirildiğinde, Online Redo Log dosyaları dolduğunda veya değiştirildiğinde, otomatik olarak **Archived Redo Log Files** (Arşivlenmiş Redo Log Dosyaları) oluşturulur.

  • **ARCHIVELOG AVANTAJI:** Herhangi bir zaman noktasına kadar (Point-in-Time Recovery) kurtarma yapılmasını sağlar. Yüksek erişilebilirlik gerektiren tüm üretim sistemlerinde zorunludur.

Yedekleme Türleri

  • **Fiziksel Yedekleme:** Veri dosyalarının (Datafiles) bir kopyasını alır. (Genellikle RMAN ile yapılır).
  • **Mantıksal Yedekleme:** Veritabanı nesnelerinin (tablo yapıları, veriler) SQL DML/DDL komutlarına dönüştürülmüş halini alır (Export/Import, Data Pump).

12.1 Index Kullanımı ve Türleri

Index (Dizin), bir tablodaki verilere erişimi hızlandırmak için kullanılan isteğe bağlı bir veritabanı yapısıdır. Tıpkı bir kitabın içindekiler veya alfabetik dizini gibi çalışır.

Index Avantajları

  • Sorgu performansını artırır (özellikle büyük tablolarda).
  • Veri bütünlüğünü sağlar (UNIQUE ve PRIMARY KEY kısıtlamaları otomatik index oluşturur).

Index Türleri

  • **B-Tree Index:** En yaygın ve varsayılan index türüdür. Tekrarlı veya düşük tekrarlı verilerde etkilidir.
  • **Bitmap Index:** Yüksek tekrarlı verilerde (Örn: Cinsiyet, Durum kodu) çok etkilidir. Data Warehouse sistemlerinde kullanılır.
  • **Function-Based Index:** Fonksiyonların sonuçları üzerine index oluşturur (Örn: UPPER(ad)).
  • **Composite Index (Birleşik):** Birden fazla sütun üzerine kurulur.

Kullanım Kuralı: Indexler, genellikle WHERE koşulunda sıkça kullanılan ve sonuç kümesini önemli ölçüde daraltan sütunlara uygulanmalıdır.

12.2 Sorgu Optimizasyonu

Sorgu optimizasyonu, bir SQL sorgusunun en verimli şekilde yürütülmesini sağlamak için değiştirilmesi veya yeniden yazılması işlemidir. Amaç, CPU ve I/O kaynaklarını en az kullanarak hızlı sonuç almaktır.

Optimizasyon Teknikleri

  • Index Kullanımını Sağlama: Sorgu yazarken indexleri atlayacak ifadelerden (Örn: Sütuna fonksiyon uygulamak gibi) kaçınmak.
  • WHERE Koşulunu Erken Uygulama: Mümkünse JOIN'lerden önce veriyi filtrelemek.
  • **Yıldızdan (*) Kaçınma:** Gereksiz sütunları çekmekten kaçınmak, sadece gerçekten ihtiyaç duyulan sütunları SELECT listesine eklemek.
  • **JOIN Türünü Seçme:** İhtiyaca göre INNER, LEFT veya FULL JOIN kullanmak.

12.3 Execution Plan Analizi

Execution Plan (Yürütme Planı), Oracle'ın Sorgu Optimizasyoncusu'nun (Query Optimizer) bir SQL komutunu nasıl yürüteceğini gösteren adım adım talimatlar setidir. Performans sorunlarının temelini anlamak için kritik öneme sahiptir.

Planın Okunması

  • Plan genellikle **en alttan başlanarak** okunur.
  • En maliyetli adımlar (yüksek I/O veya CPU kullanımı gösterenler) genellikle performans darboğazını oluşturur.
  • **TABLE ACCESS FULL (Tam Tablo Taraması):** Genellikle kaçınılması gereken, maliyetli bir işlemdir.
  • **INDEX SCAN (Dizin Taraması):** Yüksek performansı gösteren bir işlemdir.

Temel Execution Plan Yöntemleri

  • **Nested Loops:** Küçük sonuç kümeleri için uygundur (JOIN'lerde kullanılır).
  • **Hash Join:** Büyük sonuç kümeleri ve eşitlik koşulları için uygundur.
  • **Sort Merge Join:** Eşitlik dışında koşullar için kullanılır, ancak sıralama (Sort) işlemi gerektirir.

12.4 İstatistiklerin Yönetimi

Veritabanı İstatistikleri, tabloların, indexlerin ve sütunların veri dağılımı ve boyutu hakkında bilgilerdir (Örn: Tablodaki satır sayısı, bir sütundaki farklı değer sayısı, NULL oranı).

Önemleri

Sorgu Optimizasyoncusu (Query Optimizer), bir sorgunun Execution Plan'ını oluştururken en iyi kararı vermek için bu istatistikleri kullanır. Yanlış veya güncel olmayan istatistikler, Optimizasyoncu'nun kötü kararlar almasına ve dolayısıyla yavaş sorgulara yol açar.

İstatistik Toplama

Oracle, istatistikleri toplamak için DBMS_STATS paketini kullanır. Modern Oracle sürümlerinde bu işlem genellikle otomatik olarak (Otomatik İstatistik Toplama İşi) arka planda yürütülür.

EXEC DBMS_STATS.GATHER_TABLE_STATS('HR', 'ÇALIŞANLAR');

12.5 EXPLAIN PLAN Komutu

EXPLAIN PLAN, bir sorgunun yürütme maliyetini ve planını, sorguyu gerçekten çalıştırmadan önce analiz etmek için kullanılan bir komuttur. Optimizasyon çalışmalarının temel aracıdır.

Söz Dizimi

Komutun kendisi sorguyu çalıştırmaz, sadece planı geçici bir tabloya kaydeder (genellikle PLAN_TABLE).

**EXPLAIN PLAN FOR**
SELECT e.ad, d.ad FROM çalışanlar e JOIN departmanlar d ON e.dept_id = d.dept_id WHERE e.maaş > 5000;

Planı Görüntüleme

Planı kaydettikten sonra, DBMS_XPLAN paketi kullanılarak okunabilir formatta görüntülenir:

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

13.1 Kullanıcı Oluşturma (CREATE USER)

Veritabanına erişim sağlayacak kişileri veya uygulamaları tanımlamak için kullanılır. Her kullanıcının kendine ait bir şeması (schema) ve yetki seti vardır.

Söz Dizimi

**CREATE USER** yeni_kullanici
**IDENTIFIED BY** parola
**DEFAULT TABLESPACE** USERS
**QUOTA** UNLIMITED ON USERS;
  • **IDENTIFIED BY:** Kullanıcının giriş şifresi.
  • **DEFAULT TABLESPACE:** Kullanıcının nesnelerinin (tabloları vb.) varsayılan olarak depolanacağı mantıksal alan.
  • **QUOTA:** Kullanıcının bu tablespace içinde ne kadar alan kullanabileceği (MB/GB) veya UNLIMITED (sınırsız).

13.2 Yetkiler (GRANT, REVOKE)

Yetkiler, kullanıcılara belirli veritabanı işlemlerini (SQL komutlarını) veya nesneleri kullanma hakkı verir. İki ana yetki türü vardır.

1. Sistem Yetkileri (System Privileges)

Veritabanı düzeyinde işlemler yapma hakkı verir. (Örn: Yeni kullanıcı oluşturma, veritabanını başlatma/durdurma).

  • **GRANT:** Yetki verme.
  • **GRANT CREATE SESSION, CREATE TABLE TO** yeni_kullanici;
  • **REVOKE:** Yetki geri alma.
  • **REVOKE CREATE TABLE FROM** yeni_kullanici;

2. Nesne Yetkileri (Object Privileges)

Belirli bir veritabanı nesnesi üzerinde (tablo, view, sequence) işlem yapma hakkı verir.

**GRANT SELECT, INSERT ON** HR.ÇALIŞANLAR **TO** yeni_kullanici **WITH GRANT OPTION**;

WITH GRANT OPTION: Yeni_kullanici'nin, bu yetkiyi başka kullanıcılara da vermesini sağlar.

13.3 Roller (Roles)

Roller, birden fazla yetkinin (hem sistem hem de nesne yetkileri) bir araya getirildiği isimlendirilmiş bir gruplamadır. Kullanıcı yönetimi ve yetkilendirmeyi basitleştirir.

Kullanım Mantığı

Yetkileri tek tek kullanıcılara vermek yerine, yetkiler önce bir role verilir, ardından o rol ilgili kullanıcılara atanır. Bu, yüzlerce kullanıcı için yetki yönetimini kolaylaştırır.

Örnek Adımlar

  1. **Rol Oluşturma:** CREATE ROLE uygulama_gelistirici;
  2. **Role Yetki Verme:** GRANT CREATE PROCEDURE, CREATE TABLE TO uygulama_gelistirici;
  3. **Kullanıcıya Rol Atama:** GRANT uygulama_gelistirici TO yeni_kullanici;

Temel Roller: CONNECT, RESOURCE, DBA.

13.4 Profil Tanımlama (Profiles)

Profil (Profile), bir veritabanı kullanıcısının kaynak kullanımını ve parola kurallarını kısıtlamak için kullanılan bir veritabanı nesnesidir.

Kaynak Sınırlandırmaları

Kullanıcıların harcayabileceği CPU zamanını, bağlanma süresini ve aynı anda sahip olabileceği oturum sayısını kısıtlar.

CREATE PROFILE kısıtlı_kullanici LIMIT
  CPU_PER_SESSION 6000 -- Saniye
  CONNECT_TIME 30 -- Dakika
  SESSIONS_PER_USER 3;

Parola Kısıtlamaları (13.5)

Parolanın ömrü, değiştirilme süresi ve karmaşıklığı gibi kuralları belirler.

ALTER USER yeni_kullanici PROFILE kısıtlı_kullanici;

Tüm kullanıcılar varsayılan olarak DEFAULT profilini kullanır.

13.5 Parola Politikaları

Parola Politikaları, kullanıcı şifrelerinin güvenliğini sağlamak için uygulanır. Bu politikalar, PROFILE nesneleri aracılığıyla tanımlanır.

Temel Parola Kuralları (DEFAULT Profile içinde)

  • **PASSWORD_LIFE_TIME:** Parolanın süresinin dolacağı gün sayısı.
  • **PASSWORD_GRACE_TIME:** Parolanın süresi dolduktan sonra değiştirilebileceği izin süresi.
  • **PASSWORD_REUSE_TIME / PASSWORD_REUSE_MAX:** Parolanın yeniden kullanılmasına dair kısıtlamalar.
  • **FAILED_LOGIN_ATTEMPTS:** Belirtilen sayıda hatalı denemeden sonra kullanıcının hesabını kilitler.
  • **PASSWORD_VERIFY_FUNCTION:** Parolanın karmaşıklığını (büyük/küçük harf, rakam vb.) kontrol eden bir PL/SQL fonksiyonunu belirtir.

Örnek Parola Politikası Tanımlama

ALTER PROFILE DEFAULT LIMIT
  PASSWORD_LIFE_TIME 90
  FAILED_LOGIN_ATTEMPTS 5
  PASSWORD_LOCK_TIME 1/24; -- 1 saat kilitler

14.1 RMAN (Recovery Manager) Temelleri

RMAN, Oracle veritabanı yedekleme ve kurtarma işlemlerini otomatikleştiren, bloka dayalı çalışan ve veritabanı tutarlılığını garantileyen bir komut satırı aracıdır.

Mimari ve Bileşenler

  • RMAN Channel (Kanal): Okuma ve yazma işlemlerini gerçekleştiren sunucu süreçleridir. Paralel yedekleme için birden fazla kanal tanımlanabilir (DISK, SBT_TAPE).
  • Recovery Catalog: Yedekleme geçmişini ve RMAN komut dosyalarını saklayan merkezi bir veritabanı şemasıdır. DBA'ların birden fazla hedef veritabanını yönetmesini kolaylaştırır.
  • Fast Recovery Area (FRA): Yedekler, arşiv logları ve flashback loglarının tutulduğu, Oracle tarafından yönetilen disk alanıdır.

Temel Komut Örneği:

RMAN> CONFIGURE DEFAULT DEVICE TYPE TO DISK;
RMAN> RUN { ALLOCATE CHANNEL c1 DEVICE TYPE DISK; BACKUP DATABASE PLUS ARCHIVELOG; }

14.2 Tam ve Artımlı Yedekleme

Yedekleme stratejisi, kurtarma zamanı hedefi (RTO) ve veri kaybı hedefi (RPO) doğrultusunda seçilir.

Tam Yedekleme (Full/Whole Database Backup)

  • Veritabanındaki tüm kullanılmış veri bloklarını kopyalar. En hızlı kurtarmayı sağlar.
  • RMAN, yedekleme sırasında kullanılmayan (boş) blokları atlarken bile buna tam yedekleme denir.

Artımlı Yedekleme (Incremental Backup)

Yalnızca son yedeklemeden bu yana değişen veri bloklarının yedeklenmesidir. Yedekleme süresini ve depolama alanını optimize eder.

  • Level 0: Tüm blokları kopyalar. Mantıksal olarak tam yedeğe eşittir ve Artımlı yedekleme stratejisinin temelini oluşturur.
  • Level 1 Differential: Son Level 1 veya Level 0 yedekten bu yana değişen blokları yedekler.
  • Level 1 Cumulative: Son Level 0 yedekten bu yana değişen tüm blokları yedekler. Kurtarma sırasında daha az dosya gerektiği için daha hızlı kurtarma sunar.
  • Block Change Tracking (BCT): Artımlı yedekleme performansını artırmak için aktif edilmelidir. Değişen blokları takip eden hafif bir mekanizmadır.

14.3 Veri Kurtarma Senaryoları

Kurtarma işlemleri genellikle veri dosyalarının yedekten geri yüklenmesi (RESTORE) ve ardından Redo Log'ların uygulanması (RECOVER) adımlarından oluşur.

Tam Kurtarma (Complete Recovery)

  • Amaç: Veritabanını kesintisiz olarak hatanın hemen öncesine, yani en son işlenmiş Redo kaydına geri getirmektir.
  • Gerekli: Veri dosyaları yedeği ve tüm Archived Redo Log'lar.

Zamansal Kurtarma (Point-in-Time Recovery - PITR)

  • Amaç: Kullanıcı hatası (örneğin yanlışlıkla bir tablonun silinmesi) durumunda, veritabanını hatadan önceki bir zamana geri almaktır.
  • Sonuç: Kurtarma işleminden sonra veritabanı OPEN RESETLOGS komutu ile açılmalıdır, bu da kurtarma anından sonraki tüm işlemleri iptal eder.

Datafile Kurtarma

  • Veritabanı çalışırken, yalnızca bozulan data dosyasının kurtarılmasıdır. Diğer data dosyaları erişilebilir olmaya devam eder.

14.4 Flashback Teknolojisi

Veritabanı nesnelerini veya tüm veritabanını geçmişteki bir duruma hızlıca geri döndürmek için geleneksel kurtarmaya alternatif sunan bir özelliktir.

Flashback Database

  • Çalışma Prensibi: Geleneksel kurtarma gibi Redo Log'ları ileri sarmak yerine, özel olarak tutulan Flashback Log dosyalarını kullanarak yapılan değişiklikleri geri alır (Undo mantığı).
  • Hız: Yedek dosyalarının geri yüklenmesini gerektirmediği için kurtarma süresini dramatik şekilde kısaltır.
  • Yapılandırma: DB_FLASHBACK_RETENTION_TARGET parametresi ile ne kadar geçmişe gidilebileceği belirlenir.

Diğer Flashback Özellikleri

  • Flashback Table: Tek bir tabloyu, şemayı etkilemeden geçmişteki bir zamana döndürür.
  • Flashback Drop: Yanlışlıkla silinen tabloları (Recycle Bin'den) geri getirir.

14.5 Export/Import, Data Pump (expdp/impdp)

Mantıksal yedekleme ve veri taşıma için kullanılırlar. Fiziksel dosya bazlı (RMAN) yedeklemenin yerini tutmazlar.

Data Pump (expdp/impdp)

  • Paralelizm: Veri aktarımını hızlandırmak için birden fazla işçi süreci (Worker Process) kullanabilir.
  • Dizin Objesi (Directory Object): Data Pump, yedekleme dosyalarını (dump files) sunucu dosya sistemine yazmak ve okumak için Oracle veritabanı içinde tanımlanmış bir dizin objesi kullanmak zorundadır.
  • Modlar: Tam (FULL), Şema (SCHEMA), Tablo (TABLE) ve Taşıma (TRANSPORTABLE TABLESPACE).

expdp Örneği:

expdp system/pwd DUMPFILE=export.dmp DIRECTORY=DATA_PUMP_DIR SCHEMAS=hr LOGFILE=export_hr.log

15. Oracle Network & Enterprise Özellikleri

15.1 Oracle Net Services

İstemci ve sunucu arasındaki ağ iletişimini yöneten yazılım katmanıdır. Farklı protokoller ve işletim sistemleri arasında kesintisiz bağlantı sağlar.

  • TNS (Transparent Network Substrate): Oracle'ın temel iletişim protokolüdür. Bağlantı dizesinin (Connection String) çözümlenmesinden sorumludur.
  • İletişim Yönleri: Oracle Net, hem istemci-sunucu hem de sunucu-sunucu (örneğin Data Guard veya RAC) iletişimini destekler.

15.2 Listener ve Connection String

Bir istemcinin veritabanına erişimini sağlayan temel konfigürasyonel bileşenlerdir.

Listener (Dinleyici)

  • Görev: Gelen bağlantı isteklerini dinler, kabul eder ve bu isteği veritabanı sunucusuna (Dedicated/Shared Server Process) yönlendirir.
  • Yapılandırma Dosyası: listener.ora ($ORACLE_HOME/network/admin dizininde bulunur).
  • Servis Kaydı (Service Registration): Veritabanı örneği (Instance), Listener'a durumunu ve hangi hizmet adlarını (Service Name) desteklediğini otomatik olarak bildirir (Dynamic Registration).

Connection String (Bağlantı Dizisi)

  • TNSNAMES: İstemci tarafında tutulan ve sunucu adresini, portunu ve servis adını eşleyen takma isimler listesidir.
  • Kolay Bağlantı: hostname:port/service_name formatıyla hızlı bağlantı sağlar.

15.3 Enterprise Manager (OEM)

Oracle ortamları için merkezi yönetim, izleme ve otomasyon platformudur.

  • Cloud Control: Büyük kurumsal ortamlar için tam özellikli, merkezi yönetim sunar. Performans ayarlama, güvenlik yönetimi, yama uygulama ve konfigürasyon uyumluluğu kontrolü gibi görevleri otomatikleştirebilir.
  • Veritabanı Performansı İzleme: Aktif Oturum Geçmişi (Active Session History - ASH) ve Otomatik Veritabanı Teşhis Monitörü (Automatic Database Diagnostic Monitor - ADDM) raporlarını grafiksel olarak sunar.
  • DB Express: Veritabanı ile birlikte gelen basit web arayüzü, temel yönetim ve performans izleme sağlar.

15.4 Multitenant Architecture (CDB / PDB)

Oracle 12c ile sunulan ve veritabanı konsolidasyonunu radikal şekilde değiştiren mimaridir.

  • CDB (Container Database): Birden fazla PDB'yi barındıran temel yapıdır. Ortak meta verileri, arka plan süreçlerini, control file ve redo log'ları paylaşır.
  • PDB (Pluggable Database): Uygulamalar için bağımsız bir veritabanı arayüzü sunar. Bir CDB'den çıkarılıp (unplug) başka bir CDB'ye takılabilir (plug) veya klonlanabilir (clone).
  • Avantajlar: Kaynak izolasyonu, hızlı yama ve yükseltme (CDB seviyesinde yapılır), CDB'ye eklenen bir özellikten tüm PDB'lerin faydalanması.

15.5 Oracle RAC (Real Application Clusters)

Birden fazla sunucunun (node) tek bir veritabanı örneğine ortak depolama (Shared Storage) üzerinden erişerek yüksek erişilebilirlik ve ölçeklenebilirlik sağlamasıdır.

  • Clusterware (Grid Infrastructure): Küme (cluster) kaynaklarını, nodeların durumunu ve ağ trafiğini yöneten yazılımdır.
  • Global Cache Service (GCS): Nodelar arası bellek içi blok transferini yönetir. Bu, veritabanı tutarlılığını sağlamanın anahtarıdır.
  • Yük Dengeleme (Load Balancing): Gelen bağlantıları aktif olan nodelar arasında dağıtarak performansı optimize eder.
  • Yüksek Erişilebilirlik: Bir node çökerse, RAC otomatik olarak oturumları kalan nodelara yönlendirir (Failover).

15.6 Data Guard – Replikasyon ve Yüksek Erişilebilirlik

Afet kurtarma (Disaster Recovery) ve iş sürekliliği için kullanılan, birincil veritabanının bir veya daha fazla ikincil (Standby) kopyasını tutan çözümdür.

  • Log Transport Services: Birincil veritabanından Redo Log'ları Standby veritabanına taşıyan mekanizmadır.
  • Log Apply Services: Standby veritabanında gelen Redo Log'ları uygulayan mekanizmadır.
  • Maksimum Koruma (Maximum Protection): En yüksek veri kaybı koruması. Redo log'lar Standby'a yazılmadan Primary Commit işlemi yapmaz (Performans düşebilir).
  • Active Data Guard: Standby veritabanının kurtarma (recovery) uygularken aynı anda sorgu çalıştırmasına (read-only) izin verir, böylece raporlama yükünü hafifletir.

16. Uygulama Entegrasyonu ve Gerçek Projeler

16.1 Python / PHP / Java ile Oracle Bağlantısı

Modern uygulamaların veri katmanına erişimi, dile özgü sürücüler (driver) ve bağlantı protokolleri aracılığıyla gerçekleştirilir.

  • Java (JDBC): Endüstri standardıdır. Thin Driver, istemci tarafında Oracle yazılımı gerektirmediği için en çok tercih edilen sürücüdür.
  • Python (oracledb/cx_Oracle): Popüler ve kullanımı kolay, Oracle'ın resmi sürücüsüdür. PL/SQL procedure çağrılarını ve Array DML işlemlerini destekler.
  • Bağlantı Havuzlama (Connection Pooling): Yüksek hacimli uygulamalarda her istekle bağlantı açma/kapama maliyetini ortadan kaldırır. Bağlantılar bir havuzda hazır tutulur.

16.2 Oracle SQL Developer Data Modeler

Veritabanı tasarımcıları ve DBA'lar için kullanılan, veri modelleme ve tersine mühendislik aracıdır.

  • Mantıksal Model: Varlık (Entity) ve İlişki (Relationship) temelinde iş gereksinimlerini tanımlar. Veritabanı teknolojisinden bağımsızdır.
  • Fiziksel Model: Mantıksal modelin Oracle (veya diğer RDBMS) özelliklerine (veri tipleri, tablespace'ler) dönüştürülmüş halidir.
  • Tersine Mühendislik: Mevcut bir veritabanı yapısından (DDL) otomatik olarak veri modeli diyagramı oluşturabilir.
  • DDL Üretimi: Oluşturulan veya güncellenen modelden doğrudan tablo, index, constraint yaratma SQL kodlarını (DDL) üretir.

16.3 Trigger + Procedure ile Otomatik Loglama

Veritabanı içinde otomatikleşen iş mantığı (PL/SQL) ve denetim kayıtları için temel araçlardır.

Stored Procedure (Saklı Yordam)

  • Amaç: Tekrar eden, karmaşık iş mantığını veritabanında depolamak. Derlenmiş kod olarak saklanır ve daha hızlı çalışır.
  • Kullanım: Uygulama, sadece Procedure'u çağırır, tüm iş yükü sunucuda kalır (Ağ trafiği azalır).

Trigger (Tetikleyici)

  • Kullanım Senaryosu: Denetim (Audit) veya loglama için idealdir. Bir olay (INSERT, UPDATE, DELETE) gerçekleştiğinde devreye girer.
  • Örnek (Otomatik Loglama): Bir AFTER UPDATE OR DELETE ON MAASLAR trigger'ı, maaş tablosunda bir değişiklik olduğunda, değişikliğin zamanını, yapan kullanıcıyı ve eski değeri ayrı bir Audit Tablosuna otomatik olarak kaydeder.

16.4 Mini Proje: Öğrenci Veritabanı / Satış Takip Sistemi

Öğrenilen tüm kavramları (tablo oluşturma, indexleme, PL/SQL, yetkilendirme) pratik bir projede uygulama aşamasıdır.

Öğrenci Veritabanı (Okul Yönetimi Projesi)

  • Uygulanan Kavramlar: PRIMARY KEY (Öğrenci No), FOREIGN KEY (Bölüm ID), JOIN'ler, VIEW (Öğrencinin Adı, Soyadı ve Ortalama Notu).
  • PL/SQL Kullanımı: Bir öğrencinin derslerini otomatik atayan veya ders notu güncellendiğinde ortalamayı hesaplayan bir Trigger/Procedure yazma.

Satış Takip Sistemi (E-Ticaret Projesi)

  • Transaction Yönetimi: Bir siparişin başarılı sayılması için Siparişler tablosuna kayıt atılması ve Ürünler tablosundaki stok miktarının aynı anda azaltılması (`COMMIT` veya `ROLLBACK`).
  • Verimlilik: Aylık satış raporları için karmaşık sorguları hızlandıran Materialized View (Özet Görünüm) kullanımı.