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.

  • 🧺 Tanım: Bir koleksiyon, her biri benzersiz bir alt simgeyle tanımlanan, aynı türden birçok öğe içerir.
  • 📐 Varray: Sabit üst boyut, her zaman yoğun, sayısal alt simge, kullanımdan önce başlatılmalıdır.
  • 📚 İç içe tablo: Boyut sınırlaması yok, yoğun veya seyrek olabilir, sistem tablosunda saklanır, EXTEND ile genişletilebilir.
  • 🔑 Tabloya Göre İndeks: Boyut sınırlaması yok, alt simge metin veya negatif tamsayı olabilir, veritabanına kaydedilmez.
  • 🏗️ Oluşturucu: Varray ve iç içe tablolar, referans verilmeden önce başlatılmak üzere açık bir kurucuya ihtiyaç duyar.
  • Yöntem: COUNT, EXISTS, FIRST, LAST, EXTEND, TRIM ve DELETE komutları bir koleksiyonu yönetir.
  • Toplu: BULK COLLECT, hızlı işlem için bir koleksiyonu tek adımda doldurur.

Oracle PL/SQL Koleksiyonları

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

BULK COLLECT örneğiyle doldurulmuş PL/SQL koleksiyonu

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

SSS

Varray'in sabit bir üst boyutu vardır ve her zaman yoğundur. İç içe geçmiş bir tablonun boyut sınırı yoktur, seyrek olabilir ve genişletilebilir; bu da onu büyüyen veya boşluklu veriler için daha esnek hale getirir.

Çünkü bu, saklanan bir tablo değil, bellek içi ilişkisel bir dizidir. İndeks, arama anahtarı görevi görür, bu nedenle bir dize veya negatif tamsayı kullanılabilir; bu da bir oturum içindeki anahtarlı aramalar için kullanışlıdır.

Başlatılmamış bir Varray veya iç içe tablo atomik olarak null'dur, bu nedenle bir öğeye referans vermek hataya neden olur. Yapıcıyı çağırmak onu tahsis eder, ardından EXTEND ve atamalar veri ekleyebilir.

Evet. Boyutun sabit olup olmamasına, verilerin depolanıp depolanmamasına ve dize anahtarının gerekli olup olmamasına bağlı olarak, yapay zeka bir Varray'e, iç içe tabloya veya indeks tabanlı tabloya işaret edebilir ve avantaj ve dezavantajları açıklayabilir.

BULK COLLECT, SQL ve PL/SQL motorları arasında tek bir bağlam değiştirme işlemiyle tüm satırları bir koleksiyona yükler; bu da her satır için ayrı bir değiştirme işlemine gerek kalmadan büyük sonuç kümelerinde iş yükünü önemli ölçüde azaltır.

Bu yazıyı şu şekilde özetleyin: