PL / SQL-コレクション

この章では、PL / SQLのコレクションについて説明します。コレクションは、同じデータ型を持つ要素の順序付けられたグループです。各要素は、コレクション内での位置を表す一意の添え字で識別されます。

PL / SQLは3つのコレクションタイプを提供します-

  • インデックスバイテーブルまたは連想配列
  • ネストされたテーブル
  • 可変サイズ配列またはVarray

Oracleのドキュメントには、コレクションのタイプごとに次の特性が記載されています。

コレクションタイプ 要素の数 添え字タイプ 密または疎 作成場所 オブジェクトタイプ属性にすることができます
連想配列(またはインデックスバイテーブル) 無制限 文字列または整数 どちらか PL / SQLブロックのみ 番号
ネストされたテーブル 無制限 整数 密集して始まり、疎になる可能性があります PL / SQLブロックまたはスキーマレベルのいずれか はい
可変サイズ配列(Varray) 跳ねる 整数 常に密集 PL / SQLブロックまたはスキーマレベルのいずれか はい

すでにこの章でvarrayについて説明しました 'PL/SQL arrays'。この章では、PL / SQL表について説明します。

両方のタイプのPL / SQL表、つまり、索引付け表とネストされた表は同じ構造を持ち、それらの行は添え字表記を使用してアクセスされます。ただし、これら2つのタイプのテーブルは1つの側面で異なります。ネストされたテーブルはデータベース列に格納できますが、index-byテーブルは格納できません。

インデックス-テーブル別

アン index-by テーブル(別名 associative array)はのセットです key-valueペア。各キーは一意であり、対応する値を見つけるために使用されます。キーは整数または文字列のいずれかです。

インデックスバイテーブルは、次の構文を使用して作成されます。ここでは、index-by 名前の付いたテーブル table_name、そのキーはsubscript_typeになり、関連する値はelement_typeになります

TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY subscript_type; 
 
table_name type_name;

次の例は、名前とともに整数値を格納するテーブルを作成し、後で同じ名前のリストを出力する方法を示しています。

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

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

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.

index-byテーブルの要素は、 %ROWTYPE 任意のデータベーステーブルまたは %TYPE任意のデータベーステーブルフィールドの。次の例は、概念を示しています。を使用しますCUSTOMERS データベースに-として格納されているテーブル

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

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal  

PL/SQL procedure successfully completed

ネストされたテーブル

A nested tableは、任意の数の要素を持つ1次元配列のようなものです。ただし、ネストされたテーブルは、次の点で配列とは異なります。

  • 配列には宣言された数の要素がありますが、ネストされたテーブルにはありません。ネストされたテーブルのサイズは動的に増加する可能性があります。

  • 配列は常に密です。つまり、常に連続した添え字があります。ネストされた配列は最初は密ですが、要素が削除されると疎になる可能性があります。

ネストされたテーブルは、次の構文を使用して作成されます-

TYPE type_name IS TABLE OF element_type [NOT NULL]; 
 
table_name type_name;

この宣言は、の宣言に似ています index-by テーブルがありません INDEX BY 句。

ネストされたテーブルは、データベースの列に格納できます。さらに、単一列のテーブルをより大きなテーブルと結合するSQL操作を簡素化するために使用できます。連想配列をデータベースに保存することはできません。

次の例は、ネストされたテーブルの使用法を示しています。

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

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

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.

の要素 nested table することもできます %ROWTYPE任意のデータベーステーブルの、または任意のデータベーステーブルフィールドの%TYPE。次の例は、概念を示しています。データベースに格納されているCUSTOMERSテーブルを-として使用します。

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

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal  

PL/SQL procedure successfully completed.

収集方法

PL / SQLには、コレクションを使いやすくする組み込みのコレクション・メソッドが用意されています。次の表に、メソッドとその目的を示します。

S.No メソッド名と目的
1

EXISTS(n)

コレクション内のn番目の要素が存在する場合はTRUEを返します。それ以外の場合はFALSEを返します。

2

COUNT

コレクションに現在含まれている要素の数を返します。

3

LIMIT

コレクションの最大サイズを確認します。

4

FIRST

整数の添え字を使用するコレクションの最初の(最小の)インデックス番号を返します。

5

LAST

整数の添え字を使用するコレクションの最後の(最大の)インデックス番号を返します。

6

PRIOR(n)

コレクション内のインデックスnの前にあるインデックス番号を返します。

7

NEXT(n)

インデックスnに続くインデックス番号を返します。

8

EXTEND

1つのnull要素をコレクションに追加します。

9

EXTEND(n)

n個のnull要素をコレクションに追加します。

10

EXTEND(n,i)

追加します ni番目の要素のコレクションへのコピー。

11

TRIM

コレクションの最後から1つの要素を削除します。

12

TRIM(n)

削除します n コレクションの最後からの要素。

13

DELETE

コレクションからすべての要素を削除し、COUNTを0に設定します。

14

DELETE(n)

を削除します nth数値キーまたはネストされたテーブルを持つ連想配列の要素。連想配列に文字列キーがある場合、キー値に対応する要素が削除されます。場合n 無効である、 DELETE(n) 何もしません。

15

DELETE(m,n)

範囲内のすべての要素を削除します m..n連想配列またはネストされたテーブルから。場合m より大きい n または m または n 無効である、 DELETE(m,n) 何もしません。

コレクションの例外

次の表に、コレクションの例外とそれらが発生した場合を示します。

コレクションの例外 状況で発生
COLLECTION_IS_NULL アトミックにnullのコレクションを操作しようとしました。
何もデータが見つかりませんでした 下付き文字は、削除された要素、または連想配列の存在しない要素を示します。
SUBSCRIPT_BEYOND_COUNT 添え字がコレクション内の要素の数を超えています。
SUBSCRIPT_OUTSIDE_LIMIT 添え字が許容範囲外です。
VALUE_ERROR 下付き文字がnullであるか、キータイプに変換できません。この例外は、キーが次のように定義されている場合に発生する可能性があります。PLS_INTEGER 範囲であり、添え字はこの範囲外です。