Bu işleçler bütünüyle seçimseldir, yani isteğe bağlıdır.
SNPn – Snapshot İşleçleri (Snapshot Processes) İş Kuyrukları (Job Queues)
36 tane iş kuyruğu işleci olabilir, adları şöyle olacaktır: SNP0, SNP1,…, SNP9, SNPA, …, SNPZ. SNPn işleçleri atanmış sunucuyla paylaşımlı sunucunun karışımı gibidir. İşleri birbiri ardına yaparlar ama belleği atanmış sunucu gibi kullanırlar. Her bir iş kuyruğu her seferinde tek bir iş yapacaktır.
QMNn – Kuyruk Denetleyici İşleçler (Queue Monitor Processes)
Gelişmiş kuyrukları (Advanced Queues) denetlerler ve bir mesaj elverişli hale geldiklerinde bekleyenleri haberdar ederler. Ayrıca kuyruk oluşturulmasından da sorumludurlar. init.ora parametresi AQ_TM_PROCESS ile 10 tane oluşturulabilir; QMN0, …, QMN9.
EMNn – Olay Denetleyici İşleçler (Event Monitor Processes)
Gelişmiş kuyruk (Advanced Queue) mimarisinin bir parçasıdır, kuyruk abonelerine asynchoronous olarak mesajlar gönderir.
20 Temmuz 2007 Cuma
ESİR İŞLEÇLER (Slave Processes)
I/O Esirleri
Asynchronous I/O ‘yu desteklemeyen sistemlerde (kasetler (tape) gibi), asynchoronous I/O etkisini oluşturmak için kullanılırlar. İşleç önce büyük bir miktar veriyi yığın olarak tutar ve bu yazıldıktan sonra bittiğini haber verir, böylece yavaş aygıt için I/O esirleri bekler ve işlem hacmi (throughput) artar. DBWn, LGWR ve RMAN, I/O esirlerini kullanır.
Paralel Sorgu Esirleri (Parallel Query Slaves)
SQL komutları için (örneğin SELECT, CREATE TABLE, UPDATE gibi), tek bir yürütme (execution) planı yerine pek çok yürütme planı aynı anda paralel olarak uygulanır. Her bir planın sonuçları birleştirilerek tek bir büyük sonuç elde edilir. Böylece işlem daha hızlı yapılmış olur (sıralıya (sequential) göre).
Asynchronous I/O ‘yu desteklemeyen sistemlerde (kasetler (tape) gibi), asynchoronous I/O etkisini oluşturmak için kullanılırlar. İşleç önce büyük bir miktar veriyi yığın olarak tutar ve bu yazıldıktan sonra bittiğini haber verir, böylece yavaş aygıt için I/O esirleri bekler ve işlem hacmi (throughput) artar. DBWn, LGWR ve RMAN, I/O esirlerini kullanır.
Paralel Sorgu Esirleri (Parallel Query Slaves)
SQL komutları için (örneğin SELECT, CREATE TABLE, UPDATE gibi), tek bir yürütme (execution) planı yerine pek çok yürütme planı aynı anda paralel olarak uygulanır. Her bir planın sonuçları birleştirilerek tek bir büyük sonuç elde edilir. Böylece işlem daha hızlı yapılmış olur (sıralıya (sequential) göre).
11 Temmuz 2007 Çarşamba
UTF8 ve AL16UTF16 kodlamaları
Ulusal karakter seti, verileri Unicode olarak tutar; UTF8 veya AL16UTF16 kodlamalarından birini kullanarak. AL16UTF16 kodlamasında her bir karakter 2 byte yer kaplar. Bu özellik, farklı programlama dilleri karıştırıldığında, budama (truncation) hatalarının önlenmesi için string uzunluklarının belirlenmesinde kolaylık sağlar, bununla beraber çoğu ASCII karakterlerinden oluşan stringlerin depolanmasında fazladan depolama yüküne neden olur.
UTF8 kodlamasında her bir karakter 1, 2 veya 3 byte uzunluğunda yer tutar. Eğer çoğu karakter tek bir byte ile gösterilebilirse, bir değişkene veya bir tablo kolonuna daha fazla karakter sığdırılabilir; ancak veri, uzunluğu bytelarla sınrlı bir tampona aktarılırken budama (truncation) hataları oluşabilir.
Oracle şirketi, en yüksek çalışma zamanı güvenilirliği için, elverişli olan yerlerde AL16UTF16 kodlamasının kullanılamasını öneriyor. Ayrıca bir Unicode stringini tutmak için ne kadar yer gerektiğinin belirlenmesi gerekirse LENGTH fonksiyonu yerine LENGTHB fonksioyonunun kullanılması daha iyi olur.
UTF8 kodlamasında her bir karakter 1, 2 veya 3 byte uzunluğunda yer tutar. Eğer çoğu karakter tek bir byte ile gösterilebilirse, bir değişkene veya bir tablo kolonuna daha fazla karakter sığdırılabilir; ancak veri, uzunluğu bytelarla sınrlı bir tampona aktarılırken budama (truncation) hataları oluşabilir.
Oracle şirketi, en yüksek çalışma zamanı güvenilirliği için, elverişli olan yerlerde AL16UTF16 kodlamasının kullanılamasını öneriyor. Ayrıca bir Unicode stringini tutmak için ne kadar yer gerektiğinin belirlenmesi gerekirse LENGTH fonksiyonu yerine LENGTHB fonksioyonunun kullanılması daha iyi olur.
LONG ve LONG RAW veritipleri
LONG veritipi değişken uzunluklu karakter stringlerinin depolanmasında kullanılır ve uzunluğu 32760 byte ile sınırlıdır, bunun haricinde VARCHAR2 veritipine benzer. LONG RAW veritipi ise ikili (binary) verilerin ve byte stringlerinin depolanmasında kullanılır, uzunluğu en fazla 32760 byte olabilir, LONG veritipine benzer, ondan farkı ise PL/SQL tarafından yorumlanmamasıdır.
Oracle' ın tavsiyesi LONG verilerinin CLOB' a, LONG RAW verilerinin ise BLOB' a çevrilmesidir. Bir veritabanında LONG kolonu 2**31 byte uzunluğunda olabilir, bu yüzden herhangi bir LONG değeri LONG kolonuna yerleştirilebilir.
Ancak LONG kolonundan LONG değişkenine 32760 bytetan daha büyük bir değer aktarılamaz, bu sınırlamalar LONG RAW veritipi için de aynı şekilde geçerlidir. LONG kolonları metin, karakter dizileri, hatta kısa belgeler bile depolayabilirler.
LONG kolonlarına UPDATE ve INSERT deyimlerinde ve çoğu SELECT deyiminde atıfta bulunulabilir ancak ifadelerde (expressions), fonksiyon çağrılarında ve WHERE, GROUP BY, CONNECT BY gibi SQL maddelerinde (clause) LONG kolonlarına atıfta bulunulamaz.
Oracle' ın tavsiyesi LONG verilerinin CLOB' a, LONG RAW verilerinin ise BLOB' a çevrilmesidir. Bir veritabanında LONG kolonu 2**31 byte uzunluğunda olabilir, bu yüzden herhangi bir LONG değeri LONG kolonuna yerleştirilebilir.
Ancak LONG kolonundan LONG değişkenine 32760 bytetan daha büyük bir değer aktarılamaz, bu sınırlamalar LONG RAW veritipi için de aynı şekilde geçerlidir. LONG kolonları metin, karakter dizileri, hatta kısa belgeler bile depolayabilirler.
LONG kolonlarına UPDATE ve INSERT deyimlerinde ve çoğu SELECT deyiminde atıfta bulunulabilir ancak ifadelerde (expressions), fonksiyon çağrılarında ve WHERE, GROUP BY, CONNECT BY gibi SQL maddelerinde (clause) LONG kolonlarına atıfta bulunulamaz.
5 Temmuz 2007 Perşembe
PLS_INTEGER VERİTİPİ
PLS_INTEGER veritipi, işaretli tamsayıları depolamak için kullanılır. Sınır değeleri -2^31 ile 2^31 'dir, NUMBER tipine göre bellekte daha az yer kaplar. PLS_INTEGER işlemleri makina aritmetiği kullanır, bu yüzden kütüphane aritmetiği kullanan NUMBER ve BINARY_INTEGER işlemlerinden daha hızlıdır. Verimlilik açısından sınır değerleri arasında kalan hesaplamalarda PLS_INTEGER veritipinin kullanılması daha uygundur.
PLS_INTEGER ve BINARY_INTEGER 'ın sınır değeleri aynı olduğu halde bu iki veritipi tamamen uyumlu değildir. PLS_INTEGER 'da hesaplamada bir taşma (overflow) olursa istisna (exception) verir. Bu taşma BINARY_INTEGER 'da olursa eğer sonuç bir NUMBER değişkenine atanmışsa istisna vermez.
Eski uygulamalarda uyumluluk açısından BINARY_INTEGER kullanılmaya devam edilebilir, yeni uygulamalarda ise PLS_INTEGER veritipinin kullanılması daha iyi bir performans sağlayacaktır.
PLS_INTEGER ve BINARY_INTEGER 'ın sınır değeleri aynı olduğu halde bu iki veritipi tamamen uyumlu değildir. PLS_INTEGER 'da hesaplamada bir taşma (overflow) olursa istisna (exception) verir. Bu taşma BINARY_INTEGER 'da olursa eğer sonuç bir NUMBER değişkenine atanmışsa istisna vermez.
Eski uygulamalarda uyumluluk açısından BINARY_INTEGER kullanılmaya devam edilebilir, yeni uygulamalarda ise PLS_INTEGER veritipinin kullanılması daha iyi bir performans sağlayacaktır.
3 Temmuz 2007 Salı
Karşılaştırma ve Koşul İfadelerinde NULL Değerleri
Şu kurallar önemlidir ve gözardı edilmemelidir:
1) Karşılaştırmalarda eğer herhangi bir değer NULL ise sonuç NULL çıkar.
2) NULL bir değere, NOT mantık operatörü uygulanırsa sonuç gene NULL 'dır.
3) Koşullu kontrol ifadelerinde eğer koşulun sonucu NULL ise bu koşula bağlı ifadeler işleme konulmaz.
4) CASE bildirimlerinde veya CASE ifadelerinde, ifadenin sonucu NULL ise, WHEN NULL kullanılarak bu durum belirlenemez. Bunun yerine WHEN ifade IS NULL kullanılmalıdır.
Aşağıdaki örnekte y'nin değeri NULL olduğundan IF karşılaştırmasının sonucu da NULL çıkacaktır ve karşılaştırmaya bağlı ifade işleme konmayacaktır.
x := 5;
y := NULL;
...
IF x != y THEN -- sonuç NULL çıkar yani TRUE değil
sequence_of_statements; -- işleme konmaz
END IF;
1) Karşılaştırmalarda eğer herhangi bir değer NULL ise sonuç NULL çıkar.
2) NULL bir değere, NOT mantık operatörü uygulanırsa sonuç gene NULL 'dır.
3) Koşullu kontrol ifadelerinde eğer koşulun sonucu NULL ise bu koşula bağlı ifadeler işleme konulmaz.
4) CASE bildirimlerinde veya CASE ifadelerinde, ifadenin sonucu NULL ise, WHEN NULL kullanılarak bu durum belirlenemez. Bunun yerine WHEN ifade IS NULL kullanılmalıdır.
Aşağıdaki örnekte y'nin değeri NULL olduğundan IF karşılaştırmasının sonucu da NULL çıkacaktır ve karşılaştırmaya bağlı ifade işleme konmayacaktır.
x := 5;
y := NULL;
...
IF x != y THEN -- sonuç NULL çıkar yani TRUE değil
sequence_of_statements; -- işleme konmaz
END IF;
2 Temmuz 2007 Pazartesi
Kestirme Değerlendirme (Short-Circuit Evaluation)
PL/SQL 'de AND ve OR mantık operatörleri çalışırken belli durumlar için sadece ilk elemana bakarlar, ikinci elamanı göz ardı edip, değerlendirmezler, şöyle ki:
AND 'in TRUE döndürmesi için her iki elemanın da TRUE olması gerekir.
Eğer ilk eleman FALSE ise sonucun FALSE çıkacağı bellidir, bu durumda PL/SQL ikinci elemana hiç bakmayacaktır. OR için ise sonucun TRUE çıkması için iki elemanın sadece birinin TRUE olması yeterlidir. OR 'un ilk elemanı TRUE ise PL/SQL ikinci elemana hiç bakmayacaktır çünkü sonucun TRUE çıkacağı ilk elemandan bellidir.
PL/SQL 'in bu kestirme değerlendirme özelliğinden dolayı bazı hatalı yazımlarda hata mesajı ile karşılaşılmayabilir. Örneğin aşağıdaki örnekte OR operatörünün ikinci elemanında sıfıra bölme hatası olduğu halde bir hata mesajı alınmaz:
DECLARE
...
on_hand INTEGER;
on_order INTEGER;
BEGIN
...
IF (on_hand = 0) OR ((on_order / on_hand) < 5) THEN
...
END IF;
END;
AND 'in TRUE döndürmesi için her iki elemanın da TRUE olması gerekir.
Eğer ilk eleman FALSE ise sonucun FALSE çıkacağı bellidir, bu durumda PL/SQL ikinci elemana hiç bakmayacaktır. OR için ise sonucun TRUE çıkması için iki elemanın sadece birinin TRUE olması yeterlidir. OR 'un ilk elemanı TRUE ise PL/SQL ikinci elemana hiç bakmayacaktır çünkü sonucun TRUE çıkacağı ilk elemandan bellidir.
PL/SQL 'in bu kestirme değerlendirme özelliğinden dolayı bazı hatalı yazımlarda hata mesajı ile karşılaşılmayabilir. Örneğin aşağıdaki örnekte OR operatörünün ikinci elemanında sıfıra bölme hatası olduğu halde bir hata mesajı alınmaz:
DECLARE
...
on_hand INTEGER;
on_order INTEGER;
BEGIN
...
IF (on_hand = 0) OR ((on_order / on_hand) < 5) THEN
...
END IF;
END;
Kaydol:
Kayıtlar (Atom)