10 Ağustos 2007 Cuma

Birleşmeli Dizilerin (Associative Arrays) Tanımlanması

Birleşmeli Diziler (Associative Arrays) veya diğer adıyla İndisli Tablolar (Index-by-tables) için şu yazım kuralı (syntax) kullanılır:

TYPE tip_adı IS TABLE OF öğe_tipi [NOT NULL]
INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARCHAR2 (büyüklük_sınırı)];
INDEX BY anahtar_tipi;

anahtar_tipi, BINARY_INTEGER veya PLS_INTEGER tipinde bir sayısal değer olabilir, VARCHAR2 veya alttipleri olan VARCHAR, STRING veya LONG olabilir. LONG haricinde VARCHAR2-tabanlı bir anahtar'ın uzunluğu belirtilmelidir. LONG ise VARCHAR2(32760) tipinde bir anahtar bildirimi anlamına gelir.

Birleşmeli dizilerde şu tipler anahtar olarak kullanılamaz: RAW, LONG RAW, RAWID, CHAR, CHARACTER. Bir başlatma maddesine (initialization clause) gerek yoktur ve buna izin de verilmez.

VARCHAR2-tabanlı bir anahtar kullanan bir birleşmeli dizinin bir öğesine atıfta bulunulduğunda (reference), DATE ve TIMESTAMP gibi diğer tipler de kullanılabilir ancak bu tiplerin TO_CHAR fonksiyonu ile VARCHAR2'ye çevrilebilmesi gerekir.

İndisli tablolar (birleşmeli diziler), ardışık olmayan birincil anahtar değerlerini (primary key values) indis olarak kullanarak veri depolayabilir. Aşağıdaki örnekte indisli tabloda tek bir kayıt tutulmaktadır ve bu kaydın indisi 1 yerine 7468 'dir.

DECLARE
TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE
INDEX BY BINARY_INTEGER;
emp_tab EmpTabTyp;
BEGIN
/* employee (çalışan) kaydına erişim */
SELECT * INTO emp_tab(7468) FROM emp WHERE empno = 7468;
END;

Varraylerin Tanımlanması

Varraylerin tanımlanmasında şu yazım kuralı (syntax) kullanılır:

TYPE tip_adı IS {VARRAY | VARYING ARRAY} (büyüklük_sınırı) OF öğe_tipi [NOT NULL];

tip_adı ve öğe_tipi 'nin anlamları, içiçe tablolardakilerle aynıdır. büyüklük_sınırı, dizideki öğe sayısının sınır değerini gösteren bir pozitif tamsayı literalidir.

Bir VARRAY tipi tanımlanırken sınır büyüklük değeri tanımlanmalıdır. Aşağıdaki örnekte 366 tarihi depolayan bir tip tanımlanmaktadır:

DECLARE
TYPE Takvim IS VARRAY(366) OF DATE;

İçiçe Tabloların (Nested Tables) Tanımlanması

İçiçe tablolar (nested tables) için şu yazım kuralı (syntax) kullanılır:

TYPE tip_adı IS TABLE OF öğe_tipi [NOT NULL];

tip_adı, toplulukların bildirimini yapmakta kullanılan bir tip belirleyicisidir (specifier). PL/SQL içinde bildirimi yapılan içiçe tablolar için öğe_tipi, REF CURSOR haricinde herhangi bir PL/SQL veritipi olabilir.

SQL'de küresel olarak (globally) bildirimi yapılan içiçe tablolar için başka kısıtlamalar söz konusudur; şu öğe tiplerini (element types) kullanamazlar:

BINARY_INTEGER, PLS_INTEGER
BOOLEAN
LONG, LONG RAW
NATURAL, NATURALN
POSITIVE, POSITIVEN
REF CURSOR
SIGNTYPE
STRING

Topluluk Tiplerinin (Collection Types) Tanımlanması

Bir topluluk (collection) oluşturmak için önce topluluk tipi (collection type) tanımlanır sonra bu tipten değişkenlerin bildirimi (declare) yapılır. Herhangi bir PL/SQL bloğunun, altprogramının (subprogram) veya paketinin (package) bildirim kısmında (declarative part) TABLO (TABLE) ve VARRAY tipleri tanımlanabilir.

Topluluklar, diğer tipler ve değişkenler için geçerli olan scope (etkili olma aralığı) ve örneklendirme (instantiation) kurallarına uyarlar. Bir blokta veya altprogramda, bu bloğa veya altprograma giriş yapıldığında topluluklar oluşturulur ve çıkış yapıldığında ise yok edilir.

Bir pakette ise pakete ilk kez atıfta bulunulduğunda (reference) topluluklar oluşturulur ve veritabanı oturumu sona erdirildiğinde yok edilir.

8 Ağustos 2007 Çarşamba

İçiçe Tablolarla Varraylerin Farkları

Kullanılacak öğelerin (elements) sayısı önceden biliniyorsa ve bu öğelere genelde sırayla ulaşılacak ise varray kullanmak yerinde olacaktır. Veritabanında tutulurken varrayler sıralarını ve indislerini korurlar.

Her bir varray tek bir nesne olarak tutulur; 4 KB'tan daha küçükse tablo içinde, 4 KB'tan daha büyükse tablo dışında ama yine aynı tabloalanında (tablespace) depolanır. Varrayin bütün öğelerine aynı anda erişilmelidir veya bunlar aynı anda güncellenmelidir örneğin bütün öğeler üzerinde tek seferinde bir işlem yapılması gibi. Bu durum çok sayıda öğenin depolanmasında ve bunlara erişimde kullanışlı değildir.

İçiçe tablolar (nested tables) seyrek (sparse) olabilir; en sondaki öğeyi kaldırmak yerine herhangi bir öğe silinebilir. İçiçe tablo bir depolama tablosunda sırasız (out-of-line) olarak depolanır, bu depolama tablosu içiçe tablonun kendisiyle ilişkilendirilmiştir ve sistem tarafından oluşturulmuştur.

Bu durum topluluğun (collection) sadece bazı öğelerini etkileyen sorgu ve güncellemelerde içiçe tabloları kullanışlı kılar. Bir içiçe tablo veritabanında depolanırken sırası (order) ve indisler (subscripts) korunmaz, depolama ve erişimler sonrasında bu sıra ve indisler değişebilir.

3 Ağustos 2007 Cuma

İçiçe Tablolarla Birleşmeli Dizilerin Farkları

İçiçe tablolar (nested tables) da birleşmeli diziler (associative arrays) de benzer indis yazımı (subscript notation) kullanır, ancak parametre geçirme kolaylığı ve sürdürülebilirlilk açısından farklı özellikleri vardır.

İçiçe tablolar (nested tables), bir veritabanı sütununda tutulabilir ama birleşmeli diziler (associative arrays) tutulamaz. İçiçe tablolar, kalıcı olarak tutulması gereken önemli veri ilişkileri (data relationships) için uygundur.

Birleşmeli diziler, bir yordam (procedure) çağrıldığında veya bir paket (package) başlatıldığında (initialized), topluluğun (collection) bellekte oluşturulabildiği zamanlarda göreceli olarak küçük arama (lookup) tabloları için uygundur. Büyüklüğü önceden bilinmeyen bilgilerin toplanmasında uygundur çünkü birleşmeli dizilerin büyüklükleri önceden sınırlandırılmamıştır, indis değerleri de esnektir; negatif olabilir, sıralı olmayabilir ve uygun olduğunda indis için sayı yerine string değerleri kullanılabilir.

PL/SQL, sayısal anahtar değerleri (numeric key values) kullanan host dizileri ve birleşmeli dizileri kendiliğinden birbirlerine çevirir. Bir veritabanı sunucusundan veya bir veritabanı sunucusuna toplulukları (collections) geçirmenin en etkili yolu, isimsiz (anonymous) PL/SQL blokları kullanmaktır; bu bloklar girdi ve çıktı (input and output) host dizilerini birleşmeli dizilere topluca bağlamakta (bulk-bind) kullanılır.

Birleşmeli Dizilerde Küreselleşme Ayarları

VARCHAR2 anahtar değerli (key values) birleşmeli diziler (associative arrays) kullanan bir oturumda (session), ulusal dil (national language) ayarları veya küreselleşme ayarları (globalization settings) değişirse, program bir çalışma hatası (runtime error) ile karşılaşabilir.

Örneğin bir oturumda, NLS_COMP veya NLS_SORT gibi başlatma parametrelerinin (initialization parameters) değiştirilmesi NEXT ve PRIOR gibi yöntemlerin (methods) istisna (exception) vermesine neden olabilir, bu yüzden yeni işlem yapılmadan önce bu ayarlar orjinal değerlerine çevrilmelidir.

Anahtar (key) olarak bir stringi kullanan bir birleşmeli dizinin (associative array) bildirimi yapılırken, bildirimde VARCHAR2, STRING veya LONG tipi kullanılmalıdır. TO_CHAR fonksiyonu ile VARCHAR2 'ye çevrilebildiği sürece farklı bir tip de kullanılabilir, örneğin NCHAR, NVARCHAR2 veya DATE gibi.

Bununla beraber anahtar olarak kullanılan değerler tutarlı ve eşsiz olduğunda diğer tiplerin kullanımında dikkatli olunmalıdır. Örneğin NLS_DATE_FORMAT başlatma parametresi (initialization parameter) değişirse, SYSDATE 'in string değeri değişebilir; bu durumda da array_element(SYSDATE) eskiden verdiği sonucu vermez. Benzer şekilde iki farklı NVARCHAR2 değeri aynı VARCHAR2 değerine dönüşebilir (bazı ulusal karakterlerin yerine soru işareti gelerek).

Bir veritabanı bağlantısı (database link) kullanılarak, bir birleşmeli dizi (associative array) parametre olarak uzaktaki bir veritabanına gönderilirse, bu iki veritabanının farklı küreselleşme ayarları (gobalization settings) olabilir.

Uzaktaki veritabanı FIRST ve NEXT gibi işlemler yaptığında kendi karakter düzenini (character order) kullanır, bu topluluğun (collection) ilk olarak oluşturulduğu düzenden farklı olabilir. Bu karakter seti farklılıkları, uzaktaki veritabanında, eşsiz (unique) olan iki anahtarın bu eşsizlik özelliğini ortadan kaldırırsa, program VALUE_ERROR istisnası (exception) verebilir.