Oracle PL/SQL Koleksiyonları: Varray'ler, İç İçe ve Tablolara Göre Dizin
⚡ Akıllı Özet
PL/SQL koleksiyonları, her birine bir alt indis ile erişilen, aynı veri türündeki öğelerin sıralı gruplarıdır. Varray, iç içe tablo ve indeks tabanlı tablo olmak üzere üç tür, boyutun sabit olup olmamasına, alt indisin nasıl çalıştığına ve veritabanında saklanıp saklanamayacağına göre farklılık gösterir.

Koleksiyon Nedir?
Bir koleksiyon, belirli bir veri türündeki öğelerin sıralı bir grubudur. Basit bir veri türünün veya kullanıcı tanımlı veya kayıt türleri gibi karmaşık bir veri türünün koleksiyonu olabilir.
Bir koleksiyonda, her öğe "a" adı verilen bir terimle tanımlanır. "abonelik." Her öğeye benzersiz bir alt indis atanır ve veriler bu benzersiz alt indis referans alınarak işlenebilir veya alınabilir.
Koleksiyonlar, aynı türden büyük miktarda verinin işlenmesi veya manipüle edilmesi gerektiğinde en kullanışlıdır. Koleksiyonlar, 'BULK' seçeneği kullanılarak bir bütün olarak doldurulabilir ve manipüle edilebilir. Oracle.
Koleksiyonlar, aşağıda gösterildiği gibi yapı, alt simge ve depolama biçimine göre sınıflandırılır:
- İndeks tabanlı tablolar (ilişkisel diziler olarak da bilinir)
- İç içe tablolar
- Varray'ler
Bir koleksiyondaki verilere herhangi bir noktada üç terimle atıfta bulunulabilir: koleksiyon adı, alt simge ve alan veya sütun adı, örneğin " ( ). Aşağıdaki bölümlerde bu koleksiyon kategorileri hakkında bilgi edineceksiniz.
Koleksiyon Türlerine Genel Bakış
Üç farklı tahsilat türü farklı avantaj ve dezavantajlar sunar. Aşağıdaki tabloda her biri ayrıntılı olarak ele alınmadan önce yan yana gösterilmiştir.
| Görünüş | Varray | İç içe geçmiş tablo | Tabloya Göre İndeks |
|---|---|---|---|
| Beden | Sabit üst sınır | Limit yok | Limit yok |
| simge | Sayısal | Sayısal | Tamsayı veya dize |
| Yoğunluk | Her zaman yoğun | Yoğun veya seyrek | Her zaman seyrek |
| Veritabanında saklandı. | Evet | Evet | Yok hayır |
| Başlatılması gerekiyor | Evet | Evet | Yok hayır |
Varray'ler
Varray, boyutu sabit olan ve aşılamayan bir dizidir. Varray'ın indisi sayısal bir değerdir. Varray'ların özellikleri şunlardır:
- Üst sınır boyutu sabittir.
- Alt simge '1'den başlayarak sırayla doldurulur.
- Bu koleksiyon türü her zaman yoğundur; tek tek dizi elemanlarını silemeyiz. Bir Varray, tamamen silinebilir veya sonundan kırpılabilir.
- Her zaman yoğun olduğu için esnekliği çok azdır.
- Dizi boyutu bilindiğinde ve tüm elemanlar üzerinde benzer işlemler yapıldığında daha uygundur.
- Koleksiyonun alt indis sayısı ve sayısı her zaman sabit kalır.
- Kullanımdan önce başlatılmalıdır. Başlatılmamış bir koleksiyon üzerinde EXISTS işlemi dışında herhangi bir işlem hata verir.
- Veritabanı genelinde görülebilen bir veritabanı nesnesi olarak veya yalnızca orada kullanılmak üzere bir alt program içinde oluşturulabilir.
Aşağıdaki şekil, bir Varray'in (yoğun) bellek tahsisini açıklamaktadır.
| simge | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| Özellik | xyz | DFV | Sde | Cx'ler | vbc | Nhu | Qwe |
VARRAY'ın sözdizimi:
TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
- Yukarıdaki sözdiziminde, type_name, verilen boyut sınırı için 'DATA_TYPE' türünde bir VARRAY olarak tanımlanmıştır. Veri türü basit veya karmaşık olabilir.
İç içe Tablolar
İç içe tablo, dizinin boyutunun sabit olmadığı bir koleksiyondur. Sayısal indis türüne sahiptir. İç içe tablo türü hakkında daha fazla bilgi:
- İç içe geçmiş tabloların üst boyut sınırı yoktur.
- Üst sınır sabit olmadığı için, her kullanımdan önce 'EXTEND' anahtar kelimesi kullanılarak belleğin genişletilmesi gerekir.
- Alt simge '1'den başlayarak sırayla doldurulur.
- Bu koleksiyon türü hem şu şekilde olabilir: yoğun ve seyrekYoğun bir yapı oluşturabilir ve ayrıca rastgele tek tek öğeleri silerek seyrek bir yapı da oluşturabiliriz.
- Bu, dizi elemanlarını silme konusunda daha fazla esneklik sağlar.
- Sistem tarafından oluşturulan bir veritabanı tablosunda saklanır ve değerleri almak için bir SELECT sorgusunda kullanılabilir.
- Alt simge ve sayı değişebilir.
- Kullanımdan önce başlatılmalıdır. Başlatılmamış bir koleksiyon üzerinde EXISTS işlemi dışında herhangi bir işlem hata verir.
- Veritabanı genelinde görülebilen bir veritabanı nesnesi olarak veya yalnızca orada kullanılmak üzere bir alt program içinde oluşturulabilir.
Aşağıdaki şekil, iç içe geçmiş bir tablonun (yoğun ve seyrek) bellek tahsisini açıklamaktadır. Boş eleman alanı, seyrek bir elemanı gösterir.
| simge | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| Değer (yoğun) | xyz | DFV | Sde | Cx'ler | vbc | Nhu | Qwe |
| Değer (seyrek) | Qwe | asd | Afg | asd | Wer |
İç İçe Tablo Sözdizimi:
TYPE <type_name> IS TABLE OF <DATA_TYPE>;
- Yukarıdaki sözdiziminde, type_name, 'DATA_TYPE' türünde iç içe geçmiş bir tablo koleksiyonu olarak tanımlanmıştır. Veri türü basit veya karmaşık olabilir.
Tabloya Göre İndeks
İndeks tabanlı tablo, dizi boyutunun sabit olmadığı bir koleksiyon türüdür. Diğer koleksiyon türlerinden farklı olarak, indeks tabanlı tablonun indis değeri kullanıcı tarafından tanımlanabilir. İndeks tabanlı tablonun özellikleri şunlardır:
- İndis bir tamsayı veya bir metin dizesi olabilir. Koleksiyon oluşturulurken indis türü belirtilmelidir.
- Bu koleksiyonlar sıralı olarak saklanmaz.
- Doğada her zaman seyrek bulunurlar.
- Dizi boyutu sabit değildir.
- Bunlar veritabanı sütununda saklanamaz. Belirli bir oturum içinde oluşturulur ve kullanılırlar.
- Alt simgeyi korumada daha fazla esneklik sağlarlar.
- Alt indisler negatif bir dizi olabilir.
- Bunlar, aynı alt program içinde kullanılan nispeten daha küçük koleksiyon değerleri için daha uygundur.
- Kullanımdan önce başlatılmaları gerekmez.
- Bunlar veritabanı nesnesi olarak oluşturulamaz; yalnızca bir alt program içinde oluşturulabilirler.
- Bu koleksiyon türüyle BULK COLLECT kullanılamaz, çünkü her kayıt için alt indis açıkça belirtilmelidir.
Aşağıdaki şekil, indeks tabanlı bir tablonun (seyrek) bellek tahsisini açıklamaktadır. Boş bir eleman alanı, seyrek bir elemanı gösterir.
| Abonelik (varchar) | İLK | İKİNCİ | ÜÇÜNCÜ | DÖRDÜNCÜ | BEŞİNCİ | ALTINCI | YEDİNCİ |
| Değer (seyrek) | Qwe | asd | Afg | asd | Wer |
Tabloya Göre İndeksleme Sözdizimi:
TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
- Yukarıdaki sözdiziminde, type_name, 'DATA_TYPE' türünde bir indeks tabanlı tablo koleksiyonu olarak tanımlanmıştır. İndeks değişkeni, maksimum 10 boyutunda VARCHAR2 türünde verilmiştir.
Koleksiyonlarda Oluşturucu ve Başlatma Kavramı
Yapıcılar, tarafından sağlanan yerleşik işlevlerdir. Oracle Nesne veya koleksiyonla aynı ada sahip olan kurucu fonksiyonlar. Bir nesne veya koleksiyona bir oturumda ilk kez atıfta bulunulduğunda ilk olarak yürütülürler. Koleksiyon bağlamında bir kurucu fonksiyonun önemli ayrıntıları:
- Koleksiyonlar için, koleksiyonu başlatmak üzere bu yapıcı fonksiyonların açıkça çağrılması gerekir.
- Hem Varray hem de iç içe tablolar, programda kullanılmadan önce bu yapıcılar aracılığıyla başlatılmalıdır.
- Bir kurucu fonksiyon, (Varray hariç) bir koleksiyon için bellek tahsisini örtük olarak genişletir, bu nedenle koleksiyona değişkenler de atayabilir.
- Yapıcılar aracılığıyla değer atamak, koleksiyonu asla seyrek hale getirmez.
Toplama Yöntemleri
Oracle Koleksiyonlarla çalışmak ve onları manipüle etmek için birçok işlev sunar. Bu işlevler, bir koleksiyonun farklı özelliklerini belirler ve değiştirir. Aşağıdaki tabloda farklı işlevler ve açıklamaları verilmiştir.
| Yöntem | Açıklama | Sözdizimi |
|---|---|---|
| VAR (n) | Mantıksal bir sonuç döndürür. n. öğe mevcutsa TRUE, aksi halde FALSE döndürür. Başlatılmamış bir koleksiyon üzerinde yalnızca EXISTS kullanılabilir. | .EXISTS(öğe_konumu) |
| COUNT | Bir koleksiyonda bulunan öğelerin toplam sayısını verir. | .SAYMAK |
| LİMİT | Koleksiyonun maksimum boyutunu döndürür. Varray için sabit boyutu döndürür; iç içe ve indeks tabanlı tablolar için NULL döndürür. | .LIMIT |
| İLK | Koleksiyonun ilk indis değerinin sonucunu döndürür. | .BİRİNCİ |
| SON | Koleksiyonun son indis değerinin karşılığını döndürür. | .SON |
| ÖNCEKİ (n) | n. elemanın kendisinden önceki indis değerini döndürür. Eğer indis değeri yoksa, NULL döndürülür. | .ÖNCEK(n) |
| SONRAKİ (n) | n. elemanın bir sonraki indisini döndürür. Eğer hiç indis yoksa, NULL döndürülür. | .SONRAKİ(n) |
| GENİŞLET | Bir koleksiyonun sonundaki bir öğeyi genişletir. | .UZATMAK |
| UZAT (n) | Bir koleksiyonun sonundaki n öğeyi genişletir. | .EXTEND(n) |
| UZAT (n,i) | Koleksiyonun sonundaki i. öğenin n kopyasını çoğaltır. | .EXTEND(n,i) |
| TRIM | Koleksiyonun sonundan bir öğeyi kaldırır. | .KESME |
| KIRPMA (n) | Koleksiyonun sonundan n adet öğeyi kaldırır. | .KESME (n) |
| SİL | Koleksiyondaki tüm öğeleri silerek koleksiyonu boşaltır. | .SİLMEK |
| SİL (n) | n. elemanı siler. Eğer n. eleman NULL ise, hiçbir şey yapmaz. | .SİL(n) |
| SİL (m,n) | Koleksiyondaki m. ile n. aralığındaki öğeleri siler. | .DELETE(m,n) |
Örnek 1: Alt program düzeyinde kayıt türü
Bu örnekte, ' kullanarak koleksiyonu nasıl dolduracağımızı görüyoruz.TOPLU TOPLAMA' ve koleksiyon verilerine nasıl atıfta bulunulacağı.
DECLARE TYPE emp_det IS RECORD ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); TYPE emp_det_tbl IS TABLE OF emp_det; guru99_emp_rec emp_det_tbl:= emp_det_tbl(); BEGIN INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1000,'AAA',25000,1000); INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1001,'XXX',10000,1000); INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000); INSERT INTO emp (emp_no,emp_name,salary, manager) VALUES (1003,'ZZZ',7500,1000); COMMIT; SELECT emp_no,emp_name,manager,salary BULK COLLECT INTO guru99_emp_rec FROM emp; dbms_output.put_line ('Employee Detail'); FOR i IN guru99_emp_rec.FIRST..guru99_emp_rec.LAST LOOP dbms_output.put_line ('Employee Number: '||guru99_emp_rec(i).emp_no); dbms_output.put_line ('Employee Name: '||guru99_emp_rec(i).emp_name); dbms_output.put_line ('Employee Salary:'|| guru99_emp_rec(i).salary); dbms_output.put_line('Employee Manager Number:'||guru99_emp_rec(i).manager); dbms_output.put_line('--------------------------------'); END LOOP; END; /
Code açıklama
- Code 2-8. satırlar: Kayıt tipi 'emp_det' değişkeni, NUMBER, VARCHAR2, NUMBER ve NUMBER veri tiplerine sahip emp_no, emp_name, manager ve salary sütunlarıyla tanımlanmıştır.
- Code 9 hattı: 'emp_det' kayıt türü öğesine ait 'emp_det_tbl' koleksiyonu oluşturuluyor.
- Code 10 hattı: 'guru99_emp_rec' değişkenini 'emp_det_tbl' türünde tanımlayıp, null bir kurucu fonksiyonla başlatıyoruz.
- Code 12-15. satırlar: Örnek verileri 'emp' tablosuna ekleme.
- Code 16 hattı: Ekleme işlemi gerçekleştiriliyor.
- Code 17 hattı: 'emp' tablosundaki kayıtlar çekiliyor ve "BULK COLLECT" komutu kullanılarak koleksiyon değişkeni toplu olarak dolduruluyor. 'guru99_emp_rec' değişkeni artık 'emp' tablosunda bulunan tüm kayıtları içeriyor.
- Code 19-26. satırlar: 'FOR' döngüsünü, koleksiyondaki tüm kayıtları tek tek yazdıracak şekilde ayarlama. Koleksiyonun FIRST ve LAST yöntemleri, alt ve üst sınırlar olarak kullanılır. döngü.
Çıktı: Yukarıdaki kod çalıştırıldığında aşağıdaki çıktıyı alırsınız.
Employee Detail Employee Number: 1000 Employee Name: AAA Employee Salary: 25000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1001 Employee Name: XXX Employee Salary: 10000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1002 Employee Name: YYY Employee Salary: 15000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1003 Employee Name: ZZZ Employee Salary: 7500 Employee Manager Number: 1000 ----------------------------------------------

