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ğı.

Alt Program düzeyinde Kayıt Türü

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
----------------------------------------------