PL / SQL - Koleksiyonlar
Bu bölümde, PL / SQL'deki Koleksiyonları tartışacağız. Bir koleksiyon, aynı veri türüne sahip sıralı bir öğeler grubudur. Her öğe, koleksiyondaki konumunu temsil eden benzersiz bir alt simge ile tanımlanır.
PL / SQL üç toplama türü sağlar -
- Dizine göre tablolar veya İlişkili dizi
- İç içe tablo
- Değişken boyutlu dizi veya Varray
Oracle belgeleri, her koleksiyon türü için aşağıdaki özellikleri sağlar -
Koleksiyon Türü | Eleman Sayısı | Alt Simge Türü | Yoğun veya Seyrek | Nerede Oluşturuldu | Nesne Türü Özelliği Olabilir |
---|---|---|---|---|---|
İlişkilendirilebilir dizi (veya tabloya göre dizin) | Sınırsız | Dize veya tamsayı | Ya | Yalnızca PL / SQL bloğunda | Hayır |
İç içe tablo | Sınırsız | Tamsayı | Yoğun başlar, seyrekleşebilir | Ya PL / SQL bloğunda ya da şema seviyesinde | Evet |
Değişken boyutlu dizi (Varray) | Sınırlı | Tamsayı | Daima yoğun | Ya PL / SQL bloğunda ya da şema seviyesinde | Evet |
Bölümde zaten varyantı tartıştık 'PL/SQL arrays'. Bu bölümde PL / SQL tablolarını tartışacağız.
Her iki PL / SQL tablo türü, yani indeks tabloları ve iç içe geçmiş tablolar aynı yapıya sahiptir ve satırlarına alt simge notasyonu kullanılarak erişilir. Ancak, bu iki tür tablo bir açıdan farklılık gösterir; iç içe geçmiş tablolar bir veritabanı sütununda saklanabilir ve indeksli tablolar olamaz.
Dizine Göre Tablo
Bir index-by tablo (aynı zamanda associative array) bir dizi key-valueçiftler. Her anahtar benzersizdir ve ilgili değeri bulmak için kullanılır. Anahtar, bir tamsayı veya bir dize olabilir.
Aşağıdaki sözdizimi kullanılarak bir indeks tablosu oluşturulur. Burada birindex-by adlı tablo table_nameanahtarları alt simge_türü olacak ve ilişkili değerleri eleman_türü olacaktır.
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY subscript_type;
table_name type_name;
Misal
Aşağıdaki örnek, tamsayı değerlerini adlarla birlikte depolamak için bir tablonun nasıl oluşturulacağını gösterir ve daha sonra aynı ad listesini yazdırır.
DECLARE
TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20);
salary_list salary;
name VARCHAR2(20);
BEGIN
-- adding elements to the table
salary_list('Rajnish') := 62000;
salary_list('Minakshi') := 75000;
salary_list('Martin') := 100000;
salary_list('James') := 78000;
-- printing the table
name := salary_list.FIRST;
WHILE name IS NOT null LOOP
dbms_output.put_line
('Salary of ' || name || ' is ' || TO_CHAR(salary_list(name)));
name := salary_list.NEXT(name);
END LOOP;
END;
/
Yukarıdaki kod SQL isteminde yürütüldüğünde, aşağıdaki sonucu üretir -
Salary of James is 78000
Salary of Martin is 100000
Salary of Minakshi is 75000
Salary of Rajnish is 62000
PL/SQL procedure successfully completed.
Misal
Bir indeks tablosunun öğeleri de bir %ROWTYPE herhangi bir veritabanı tablosunun veya %TYPEherhangi bir veritabanı tablosu alanı. Aşağıdaki örnek kavramı göstermektedir. KullanacağızCUSTOMERS veritabanımızda şu şekilde saklanan tablo -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
DECLARE
CURSOR c_customers is
select name from customers;
TYPE c_list IS TABLE of customers.Name%type INDEX BY binary_integer;
name_list c_list;
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter +1;
name_list(counter) := n.name;
dbms_output.put_line('Customer('||counter||'):'||name_lis t(counter));
END LOOP;
END;
/
Yukarıdaki kod SQL isteminde yürütüldüğünde, aşağıdaki sonucu üretir -
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
PL/SQL procedure successfully completed
İç içe Tablolar
Bir nested tablekeyfi sayıda eleman içeren tek boyutlu bir dizi gibidir. Bununla birlikte, iç içe geçmiş bir tablo, aşağıdaki yönlerden bir diziden farklıdır:
Bir dizinin belirtilen sayıda öğesi vardır, ancak iç içe geçmiş bir tablo yoktur. İç içe geçmiş bir tablonun boyutu dinamik olarak artabilir.
Bir dizi her zaman yoğundur, yani her zaman ardışık alt simgelere sahiptir. İç içe geçmiş bir dizi başlangıçta yoğundur, ancak ondan öğeler silindiğinde seyrekleşebilir.
Aşağıdaki sözdizimi kullanılarak iç içe geçmiş bir tablo oluşturulur -
TYPE type_name IS TABLE OF element_type [NOT NULL];
table_name type_name;
Bu beyan, bir beyanname ile benzerdir. index-by masa, ama yok INDEX BY fıkra.
İç içe geçmiş bir tablo, bir veritabanı sütununda saklanabilir. Tek sütunlu bir tabloyu daha büyük bir tabloyla birleştirdiğiniz SQL işlemlerini basitleştirmek için daha fazla kullanılabilir. İlişkilendirilebilir bir dizi, veritabanında saklanamaz.
Misal
Aşağıdaki örnekler, iç içe geçmiş tablonun kullanımını göstermektedir -
DECLARE
TYPE names_table IS TABLE OF VARCHAR2(10);
TYPE grades IS TABLE OF INTEGER;
names names_table;
marks grades;
total integer;
BEGIN
names := names_table('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz');
marks:= grades(98, 97, 78, 87, 92);
total := names.count;
dbms_output.put_line('Total '|| total || ' Students');
FOR i IN 1 .. total LOOP
dbms_output.put_line('Student:'||names(i)||', Marks:' || marks(i));
end loop;
END;
/
Yukarıdaki kod SQL isteminde yürütüldüğünde, aşağıdaki sonucu üretir -
Total 5 Students
Student:Kavita, Marks:98
Student:Pritam, Marks:97
Student:Ayan, Marks:78
Student:Rishav, Marks:87
Student:Aziz, Marks:92
PL/SQL procedure successfully completed.
Misal
Bir nested table aynı zamanda bir %ROWTYPEherhangi bir veritabanı tablosu veya herhangi bir veritabanı tablosu alanının% TYPE'ı. Aşağıdaki örnek kavramı göstermektedir. Veritabanımızda saklanan MÜŞTERİLER tablosunu şu şekilde kullanacağız:
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
DECLARE
CURSOR c_customers is
SELECT name FROM customers;
TYPE c_list IS TABLE of customerS.No.ame%type;
name_list c_list := c_list();
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter +1;
name_list.extend;
name_list(counter) := n.name;
dbms_output.put_line('Customer('||counter||'):'||name_list(counter));
END LOOP;
END;
/
Yukarıdaki kod SQL isteminde yürütüldüğünde, aşağıdaki sonucu üretir -
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
PL/SQL procedure successfully completed.
Toplama Yöntemleri
PL / SQL, koleksiyonların kullanımını kolaylaştıran yerleşik toplama yöntemleri sağlar. Aşağıdaki tablo yöntemleri ve amaçlarını listeler -
S.No | Yöntem Adı ve Amacı |
---|---|
1 | EXISTS(n) Bir koleksiyondaki n'inci öğe varsa TRUE döndürür; aksi takdirde FALSE döndürür. |
2 | COUNT Bir koleksiyonun şu anda içerdiği öğe sayısını döndürür. |
3 | LIMIT Bir koleksiyonun maksimum boyutunu kontrol eder. |
4 | FIRST Tamsayı alt simgelerini kullanan bir koleksiyondaki ilk (en küçük) dizin numaralarını döndürür. |
5 | LAST Tamsayı alt simgelerini kullanan bir koleksiyondaki son (en büyük) dizin numaralarını döndürür. |
6 | PRIOR(n) Bir koleksiyondaki n dizininden önce gelen dizin numarasını döndürür. |
7 | NEXT(n) Dizin n'den sonra gelen dizin numarasını döndürür. |
8 | EXTEND Bir koleksiyona bir boş öğe ekler. |
9 | EXTEND(n) Bir koleksiyona n null öğe ekler. |
10 | EXTEND(n,i) Ekler ni'nci öğenin bir koleksiyona kopyaları . |
11 | TRIM Bir koleksiyonun sonundan bir öğeyi kaldırır. |
12 | TRIM(n) Kaldırır n bir koleksiyonun sonundaki öğeler. |
13 | DELETE COUNT değerini 0 olarak ayarlayarak bir koleksiyondaki tüm öğeleri kaldırır. |
14 | DELETE(n) Kaldırır nthsayısal anahtar veya iç içe tablo içeren bir ilişkilendirilebilir diziden öğe. İlişkilendirilebilir dizinin bir dize anahtarı varsa, anahtar değerine karşılık gelen öğe silinir. Eğern boş, DELETE(n) hiç birşey yapmıyor. |
15 | DELETE(m,n) Aralıktaki tüm öğeleri kaldırır m..nilişkilendirilebilir bir diziden veya iç içe tablodan. Eğerm daha büyük n ya da eğer m veya n boş, DELETE(m,n) hiç birşey yapmıyor. |
Koleksiyon İstisnaları
Aşağıdaki tablo koleksiyon istisnalarını ve ne zaman ortaya çıktıklarını gösterir -
Koleksiyon İstisnası | Durumlarda Yükselen |
---|---|
COLLECTION_IS_NULL | Atomik olarak boş bir koleksiyon üzerinde çalışmaya çalışırsınız. |
VERİ BULUNAMADI | Bir alt simge, silinmiş bir öğeyi veya ilişkilendirilebilir bir dizinin var olmayan bir öğesini belirtir. |
SUBSCRIPT_BEYOND_COUNT | Bir alt simge, bir koleksiyondaki öğe sayısını aşıyor. |
SUBSCRIPT_OUTSIDE_LIMIT | Bir alt simge izin verilen aralığın dışında. |
VALUE_ERROR | Bir alt simge boştur veya anahtar türüne dönüştürülemez. Bu istisna, anahtar birPLS_INTEGER aralık ve alt simge bu aralığın dışındadır. |