Plsql-arrays
PL/SQL-配列
この章では、PL/SQLの配列について説明します。 PL/SQLプログラミング言語は、 VARRAY と呼ばれるデータ構造を提供します。これは、同じタイプの要素の固定サイズの順次コレクションを格納できます。 VARRAYは、順序付けられたデータのコレクションを格納するために使用されますが、配列を同じタイプの変数のコレクションと考える方が良い場合がよくあります。
すべてのVARRAYは、連続したメモリー位置で構成されています。 最下位アドレスは最初の要素に対応し、最上位アドレスは最後の要素に対応します。
配列はコレクション型データの一部であり、可変サイズの配列を表します。 他のコレクションタイプについては、後の章「* PL/SQLコレクション」*で学習します。
*varray* の各要素には、インデックスが関連付けられています。 また、動的に変更できる最大サイズもあります。
Varrayタイプの作成
*CREATE TYPE* ステートメントを使用して、VARRAY型が作成されます。 VARRAYに格納される要素の最大サイズとタイプを指定する必要があります。
スキーマレベルでVARRAY型を作成するための基本的な構文は次のとおりです-
CREATE OR REPLACE TYPE varray_type_name IS VARRAY(n) of <element_type>
どこで、
_varray_type_name_は有効な属性名です。
_n_は、VARRAYの要素数(最大)です。
_element_type_は、配列の要素のデータ型です。
*ARTER TYPE* ステートメントを使用して、VARRAYの最大サイズを変更できます。
例えば、
CREATE Or REPLACE TYPE namearray AS VARRAY(3) OF VARCHAR2(10);
/
Type created.
PL/SQLブロック内にVARRAY型を作成するための基本的な構文は次のとおりです-
TYPE varray_type_name IS VARRAY(n) of <element_type>
たとえば-
TYPE namearray IS VARRAY(5) OF VARCHAR2(10);
Type grades IS VARRAY(5) OF INTEGER;
概念を理解するために、いくつかの例を試してみましょう-
例1
次のプログラムは、VARRAYの使用を示しています-
DECLARE
type namesarray IS VARRAY(5) OF VARCHAR2(10);
type grades IS VARRAY(5) OF INTEGER;
names namesarray;
marks grades;
total integer;
BEGIN
names := namesarray('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.
注意してください-
- Oracle環境では、VARRAYの開始インデックスは常に1です。
- VARRAYと同じ名前のVARRAYタイプのコンストラクタ・メソッドを使用して、VARRAY要素を初期化できます。
- Varrayは1次元配列です。 *VARRAYは、宣言されると自動的にNULLになり、要素を参照する前に初期化する必要があります。
例2
VARRAYの要素は、任意のデータベース表の%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 varray (6) of customers.name%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.