PL/SQL Collections

Oracle PL/SQL ile benzer veri türüne sahip değerleri tek bir değişkende tutmak için kullanılan collections veya koleksiyonlar ile ilgili bilgiler yer alıyor.

Collections

Benzer veri türüne sahip değerlerin saklandığı ve değişken kapasitesinin dinamik olarak büyüdüğü veri türüdür.

Koleksiyonlar PL/SQL içerisinde yer alan diziler gibi aynı veri türüne sahip verileri bir değişkende saklamak için kullanılır.

Koleksiyonların dizilerden farkı boyutlarının yeni eleman eklendiğinde veya istendiğinde değiştirilebilir olmasıdır.

PL/SQL koleksiyon yapısı Associative (Index-By Table), Nested Table, Varray olmak üzere üçe ayrılır.

Associative Array

Verileri anahtar-değer çifti olarak saklayan koleksiyon türüdür.

Veri eklendikçe koleksiyon boyutu artar.

Associative Array tanımlaması aşağıdaki gibidir.

TYPE dizi_adi IS TABLE OF deger_veri_turu [NOT NULL] INDEX BY anahtar_veri_turu;

Örnek Associative Array kullanım aşağıdaki gibidir.

DECLARE
    TYPE KISI_LISTESI IS TABLE OF NUMBER INDEX BY VARCHAR2(20);
    KISILER KISI_LISTESI;
    KISI_ADI VARCHAR2(20);
BEGIN
    KISILER('Yusuf') := 123;
    KISILER('Ramazan') := 456;
    KISILER('Sinan') := 789;
    KISILER('Mehmet') := 987;

    KISI_ADI := KISILER.FIRST;
    WHILE KISI_ADI IS NOT NULL LOOP
        DBMS_OUTPUT.put_line(KISI_ADI || ' - ' || KISILER(KISI_ADI));
        KISI_ADI := KISILER.NEXT(KISI_ADI);
    END LOOP; 
END;

Anahtar değerini sayısal bir değer yapmak istenirse VARCHAR2(20) yerine PLS_INTEGER, NUMBER gibi sayısal bir veri türü belirlenebilir.

Nested Table

Verileri dizilerdeki gibi saklamamıza imkan veren koleksiyon türüdür.

Koleksiyonu dizilerden ayıran en önemli özellik kapasitesinin attırılabiliyor olmasıdır.

TYPE dizi_adi IS TABLE OF deger_veri_turu [NOT NULL]

Associative Array türünden farklı olarak INDEX BY kullanılmaz.

DECLARE
    TYPE KISI_LISTESI IS TABLE OF VARCHAR2(20);
    KISILER KISI_LISTESI;
    KISI_SAYISI PLS_INTEGER;
BEGIN
    KISILER := KISI_LISTESI('Yusuf', 'Ramazan', 'Sinan', 'Ramazan');

    KISI_SAYISI := KISILER.COUNT;
    FOR I IN 1 .. KISI_SAYISI LOOP
        DBMS_OUTPUT.put_line(I || ' - ' || KISILER(I));
    END LOOP;
END;

Koleksiyona değer ekleme EXTEND metodu koleksiyon genişletilerek yapılır.

DECLARE
    TYPE KISI_LISTESI IS TABLE OF VARCHAR2(20);
    KISILER KISI_LISTESI;
    KISI_SAYISI PLS_INTEGER;
BEGIN
    KISILER := KISI_LISTESI('Yusuf', 'Ramazan', 'Sinan', 'Ramazan');

    KISILER.EXTEND;
    KISILER(KISILER.COUNT) := 'Yeni değer eklendi.';

    KISI_SAYISI := KISILER.COUNT;
    FOR I IN 1 .. KISI_SAYISI LOOP
        DBMS_OUTPUT.put_line(I || ' - ' || KISILER(I));
    END LOOP;
END;

Varray

Birçok programlama dilinde yer alan diziler PL/SQL dilinde de yer alır.

Diğer programlama dillerinden farklı olarak PL/SQL dizileri bir (1)’den başlar.

Dizi tanımlaması aşağıdaki gibidir.

CREATE OR REPLACE TYPE dizi_adi IS VARRAY(dizi_boyut) OF dizi_veri_turu
TYPE dizi_adi IS VARRAY(dizi_boyut) OF dizi_veri_turu

Örnek dizi kullanım aşağıdaki gibidir.

SET SERVEROUTPUT ON;
DECLARE
    TYPE KISILER IS VARRAY(4) OF VARCHAR2(20);
    LISTE KISILER;
    KISI_SAYISI PLS_INTEGER := 0;
BEGIN
    LISTE := KISILER('Yusuf', 'Ramazan', 'Sinan', 'Mehmet');
    KISI_SAYISI := LISTE.COUNT;

    FOR i IN 1..KISI_SAYISI LOOP
        DBMS_OUTPUT.put_line(LISTE(i));
    END LOOP;

END;

Koleksiyon metotları

Koleksiyonları esnek bir şekilde kullanmak için çeşitli metotlar yer alır.

EXISTS(SIRA) – Parametre olarak verilen sıra koleksiyonda var mı kontrol eder.

COUNT – Koleksiyondaki eleman sayısını verir.

LIMIT – Koleksiyon kapasitesini verir.

FIRST – Koleksiyondaki ilk sıra (index) değerini verir.

LAST – Koleksiyondaki son sıra (index) değerini verir.

PRIOR(SIRA) – Parametre ile verilen Sıra (index)dan önceki sıra numarasını verir.

NEXT(SIRA) – Parametre ile verilen Sıra (index)dan sonraki sıra numarasını verir.

EXTEND – Koleksiyonu genişletir.

EXTEND(MIKTAR) – Koleksiyon MIKTAR kadar genişletir.

EXTEND(MIKTAR, SIRA) – Koleksiyonu SIRA ile belirtilen yerden MIKTAR kadar genişletir.

TRIM – Koleksiyondaki son değeri siler.

TRIM(MIKTAR) – Koleksiyonun sonundan itibaren MIKTAR kadar değer siler.

DELETE – Koleksiyondaki tüm değerleri siler.

DELETE(SIRA) – Parametre (SIRA) olarak verilen değeri siler.

DELETE(BASLANGIC, BITIS) – BASLANGIC ve BITIS değeri arasındaki değerleri siler.

PL/SQL Derslerine buradan ulaşabilirsiniz.

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!