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.