Oracle PL/SQL Koleksiyonları: Varray'ler, İç İçe ve Tablolara Göre Dizin
Koleksiyon Nedir?
Bir Koleksiyon, belirli veri türlerinin öğelerinin sıralı bir grubudur. Basit veri türü veya karmaşık veri türü (kullanıcı tanımlı veya kayıt türleri gibi) koleksiyonu olabilir.
Koleksiyondaki her öğe, adı verilen bir terimle tanımlanır. "abonelik." Koleksiyondaki her öğeye benzersiz bir abonelik atanır. Bu koleksiyondaki veriler, bu benzersiz alt simgeye başvurularak değiştirilebilir veya getirilebilir.
Koleksiyonlar, aynı türden büyük bir verinin işlenmesi veya değiştirilmesi gerektiğinde en yararlı şeylerdir. Koleksiyonlar, 'BULK' seçeneği kullanılarak bir bütün olarak doldurulabilir ve değiştirilebilir. Oracle.
Koleksiyonlar aşağıda gösterildiği gibi yapıya, alt simgeye ve depolamaya göre sınıflandırılır.
- Tablolara göre dizinler (İlişkisel Dizi olarak da bilinir)
- İç içe tablolar
- Varray'ler
Koleksiyondaki veriler herhangi bir noktada Koleksiyon adı, Abonelik, Alan/Sütun adı olmak üzere üç terimle anılabilir: " ( ). ”. Yukarıda belirtilen koleksiyon kategorileri hakkında aşağıdaki bölümde daha fazla bilgi edineceksiniz.
Varray'ler
Varray, dizinin boyutunun sabit olduğu bir toplama yöntemidir. Dizi boyutu, sabit değerinden fazla olamaz. Varray'in alt dizini sayısal bir değerdir. Aşağıda Varray'lerin nitelikleri verilmiştir.
- Üst sınır boyutu sabittir
- '1' alt simgesiyle başlayarak sırayla doldurulur
- Bu koleksiyon türü her zaman yoğundur, yani herhangi bir dizi öğesini silemeyiz. Varray bütün olarak silinebildiği gibi uçtan da kesilebilir.
- Doğada her zaman yoğun olduğundan esnekliği çok azdır.
- Dizi boyutu bilindiğinde kullanılması ve tüm dizi elemanları üzerinde benzer etkinliklerin yapılması daha uygundur.
- Alt simge ve dizi her zaman sabit kalır, yani koleksiyonun alt simgesi ve sayısı her zaman aynıdır.
- Programlarda kullanılmadan önce başlatılmaları gerekir. Başlatılmamış bir koleksiyondaki herhangi bir işlem (EXISTS işlemi hariç) hata verecektir.
- Veritabanı genelinde görülebilen veya alt program içerisinde yalnızca o alt programda kullanılabilen bir veritabanı nesnesi olarak oluşturulabilir.
Aşağıdaki şekil Varray'in (yoğun) bellek tahsisini şematik olarak açıklayacaktı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ündeki VARRAY olarak tanımlanır. Veri türü basit veya karmaşık tür olabilir.
İç içe Tablolar
Yuvalanmış tablo, dizinin boyutunun sabit olmadığı bir koleksiyondur. Sayısal alt simge türüne sahiptir. Aşağıda iç içe tablo türüyle ilgili daha fazla açıklama bulunmaktadır.
- Nested tablonun üst boyut sınırı yoktur.
- Üst boyut sınırı sabit olmadığı için koleksiyonun, hafızanın her kullanımdan önce genişletilmesi gerekiyor. 'EXTEND' anahtar sözcüğünü kullanarak koleksiyonu genişletebiliriz.
- '1' alt simgesinden başlayarak sırayla doldurulur.
- Bu koleksiyon türü her ikisinden de olabilir yoğun ve seyrekyani koleksiyonu yoğun olarak oluşturabiliriz ve ayrıca tek tek dizi elemanını rastgele silerek onu seyrek hale getirebiliriz.
- Dizi öğesinin silinmesi konusunda daha fazla esneklik sağlar.
- Sistem tarafından oluşturulan veritabanı tablosunda saklanır ve değerleri getirmek için seçme sorgusunda kullanılabilir.
- Alt simge ve dizi sabit değildir, yani alt simge ve dizi öğesinin sayısı değişebilir.
- Programlarda kullanılmadan önce başlatılmaları gerekir. Başlatılmamış koleksiyondaki herhangi bir işlem (EXISTS işlemi hariç) bir hata verecektir.
- Veritabanı genelinde görülebilen veya alt program içerisinde yalnızca o alt programda kullanılabilen bir veritabanı nesnesi olarak oluşturulabilir.
Aşağıdaki şekil İç İçe Tablonun (yoğun ve seyrek) bellek tahsisini şematik olarak açıklayacaktır. Siyah renkli öğe alanı, bir koleksiyondaki boş öğeyi, yani seyrekliği belirtir.
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 <tvpe name> IS TABLE OF <DATA TYPE>;
- Yukarıdaki sözdiziminde, type_name, 'DATA_TYPE' türündeki İç içe geçmiş tablo koleksiyonu olarak tanımlanmıştır. Veri türü basit veya karmaşık tür olabilir.
Tablo bazında dizin
Dizin-tablo, dizi boyutunun sabit olmadığı bir koleksiyondur. Diğer koleksiyon tiplerinin aksine, dizin-tablo koleksiyonunda alt dizin kullanıcı tarafından tanımlanabilir. Aşağıda dizin-tablonun öznitelikleri verilmiştir.
- Alt simge tam sayı veya dizelerden oluşabilir. Koleksiyon oluşturulurken alt simge tipi belirtilmelidir.
- Bu koleksiyonlar sıralı olarak saklanmaz.
- Doğada her zaman seyrek bulunurlar.
- Dizi boyutu sabit değildir.
- Veritabanı sütununda saklanamazlar. Bunlar, söz konusu oturumdaki herhangi bir programda oluşturulacak ve kullanılacaktır.
- Aboneliğin korunması açısından daha fazla esneklik sağlarlar.
- Alt simgeler aynı zamanda negatif alt simge dizisinden de olabilir.
- Koleksiyonun başlatılabileceği ve aynı alt programlar içinde kullanılabileceği nispeten daha küçük kolektif değerler için kullanılması daha uygundur.
- Kullanmaya başlamadan önce başlatılmalarına gerek yoktur.
- Bir veritabanı nesnesi olarak oluşturulamaz. Yalnızca o alt programda kullanılabilen alt programın içinde oluşturulabilir.
- Koleksiyondaki her kayıt için alt simgenin açıkça verilmesi gerektiğinden bu koleksiyon türünde BULK COLLECT kullanılamaz.
Aşağıdaki şekil İç İçe Tablonun (seyrek) bellek tahsisini şematik olarak açıklayacaktır. Siyah renkli öğe alanı, bir koleksiyondaki boş öğeyi, yani seyrekliği belirtir.
Abonelik (varchar) | İLK | İKİNCİ | ÜÇÜNCÜ | DÖRDÜNCÜ | BEŞİNCİ | ALTINCI | YEDİNCİ |
Değer (seyrek) | Qwe | asd | Afg | asd | Wer |
Tablo Bazında Dizin 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 tablo-dizin koleksiyonu olarak tanımlanmıştır. Veri türü basit veya karmaşık tür olabilir. subsciprt/index değişkeni, maksimum boyutu 2 olan VARCHAR10 türü olarak verilmiştir.
Koleksiyonlarda Oluşturucu ve Başlatma Kavramı
Yapıcılar, oracle tarafından sağlanan ve nesne veya koleksiyonlarla aynı adı taşıyan yerleşik işlevlerdir. Bir oturumda nesne veya koleksiyonlar ilk kez referans alındığında ilk önce yürütülürler. Aşağıda, koleksiyon bağlamındaki yapıcının önemli ayrıntıları verilmiştir:
- Koleksiyonlar için, bu kurucuların başlatılması için açıkça çağrılması gerekir.
- Hem Varray hem de Nested tablolarının programa yönlendirilmeden önce bu yapıcılar aracılığıyla başlatılması gerekir.
- Yapıcı, bir koleksiyon için (Varray hariç) bellek tahsisini örtülü olarak genişletir, dolayısıyla yapıcı aynı zamanda değişkenleri koleksiyonlara da atayabilir.
- Koleksiyona yapıcılar aracılığıyla değer atamak asla koleksiyonu seyrekleştirmez.
Toplama Yöntemleri
Oracle koleksiyonları yönetmek ve onlarla çalışmak için birçok işlev sağlar. Bu işlevler, koleksiyonların farklı niteliklerini belirlemek ve değiştirmek için programda çok faydalıdır. Aşağıdaki tablo farklı işlevleri ve açıklamalarını verecektir.
Yöntem | Açıklama | SÖZDİZİMİ |
---|---|---|
VAR (n) | Bu yöntem Boole sonuçlarını döndürecektir. Eğer n ise 'TRUE' değerini döndürecektir.th Bu koleksiyonda öğe mevcutsa, FALSE değerini döndürür. Başlatılmamış koleksiyonda yalnızca EXISTS işlevleri 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 tanımlanmış olan sabit boyutu döndürecektir. Yuvalanmış tablo ve Tablo bazında Dizin için NULL değerini verir | .LIMIT |
İLK | Koleksiyonların ilk dizin değişkeninin (abonelik) değerini döndürür | .BİRİNCİ |
SON | Koleksiyonların son indeks değişkeninin (abonelik) değerini döndürür | .SON |
ÖNCEKİ (n) | N'den oluşan bir koleksiyonda indeks değişkeninden önce gelen değeri döndürürth eleman. Eğer öncesinde indeks değeri yoksa NULL döndürülür | .ÖNCEK(n) |
SONRAKİ (n) | N'den oluşan bir koleksiyondaki başarılı indeks değişkenini döndürürth eleman. Başarılı bir indeks değeri yoksa NULL döndürülür | .SONRAKİ(n) |
GENİŞLET | Koleksiyonun sonundaki bir öğeyi genişletir | .UZATMAK |
UZAT (n) | Bir koleksiyonun sonundaki n öğeyi genişletir | .EXTEND(n) |
UZAT (n,i) | i'nin n kopyasını genişletirth koleksiyonun sonundaki öğe | .EXTEND(n,i) |
TRIM | Koleksiyonun sonundan bir öğeyi kaldırır | .KESME |
KIRPMA (n) | Koleksiyonun sonundan n öğeyi kaldırır | .KESME (n) |
SİL | Koleksiyondaki tüm öğeleri siler. Koleksiyonu boş yapar | .SİLMEK |
SİL (n) | Koleksiyondan n'inci öğeyi siler. eğer nth eleman NULL ise bu hiçbir şey yapmaz | .SİL(n) |
SİL (m,n) | m aralığındaki öğeyi silerth n'yeth koleksiyonda | .DELETE(m,n) |
Örnek1: Alt Program Düzeyinde Kayıt Türü
Bu örnekte koleksiyonu ' kullanarak nasıl dolduracağımızı göreceğiz.TOPLU TOPLAMA' ve toplama verilerine nasıl başvurulacağı.
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; /
Kod Açıklaması:
- Kod satırı 2-8: Kayıt tipi 'emp_det', NUMBER, VARCHAR2, NUMBER, NUMBER veri türünün emp_no, emp_name, maaş ve yöneticisi sütunlarıyla bildirildi.
- Kod satırı 9: 'emp_det' kayıt türü öğesinin 'emp_det_tbl' koleksiyonunu oluşturma
- Kod satırı 10: 'Guru99_emp_rec' değişkeninin 'emp_det_tbl' türü olarak bildirilmesi ve null yapıcıyla başlatılması.
- Kod satırı 12-15: Örnek verileri 'emp' tablosuna ekleme.
- Kod satırı 16: Ekleme işlemi gerçekleştiriliyor.
- Kod satırı 17: 'Emp' tablosundan kayıtların getirilmesi ve “BULK COLLECT” komutu kullanılarak koleksiyon değişkeninin toplu olarak doldurulması. Artık 'guru99_emp_rec' değişkeni 'emp' tablosunda bulunan tüm kayıtları içerir.
- Kod satırı 19-26: Koleksiyondaki tüm kayıtları tek tek yazdırmak için 'FOR' döngüsünü kullanarak ayarlama. FIRST ve LAST toplama yöntemi alt ve üst limit olarak kullanılır. döngü.
Çıktı: Yukarıdaki ekran görüntüsünde görebileceğiniz gibi yukarıdaki kod çalıştırıldığında aşağıdaki çıktıyı alacaksı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 ----------------------------------------------