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 範囲であり、添え字はこの範囲外です。 |