pl sql collections nested table
コード例を使用して、PL SQLコレクション、コレクション・メソッド、Varray、ネストされた表、および連想配列の基本を学習します。
の中に PL / SQLサブプログラム のチュートリアル PL / SQLシリーズ 、プロシージャと関数、さまざまなパラメータの受け渡し方法、およびPL / SQLでプロシージャと関数を作成/削除する方法について学習しました。
この記事では、PLSQLコレクションと関連する概念について説明します。また、PL / SQLで使用可能なVarray、ネストされた表、および索引付け表の概念についても説明します。
さらに、組み込みのコレクション例外とコレクションメソッドのいくつかについて説明します。
学習内容:
PLSQLコレクション
コレクションは、同種のデータ型の要素のグループです。通常、配列、リスト、セットなどで構成されます。各要素には、その位置を反映する特定の添え字があります。
PLSQLコレクションには次のタイプがあります。
- 連想配列/インデックス-テーブル別
- ネストされたテーブル。
- ヴァレー。
PL SQLコレクションは通常、OracleでキーワードBULK COLLECTを使用して、データの大きなチャンクを格納および操作するために使用されます。
収集方法
Pl / SQLには、以下にリストされているコレクション内のいくつかの組み込みメソッドがあります。
Sl。番号。 | 名前 | 説明 |
---|---|---|
7 | next(m) | m番目のインデックスに続くインデックスを与えます。 |
1 | カウント | コレクションに存在する要素の数を示します。 |
二 | 制限 | コレクションのサイズを確認します。 |
3 | 存在する(m) | コレクションに存在するm番目の要素がfalseを返す場合はtrueを返します。 |
4 | 最初 | コレクション内の開始インデックス番号に整数の添え字を付けます。 |
5 | 最終 | コレクション内の終了インデックス番号に整数の添え字を付けます。 |
6 | 拡張する | コレクションの最後にNULL要素を追加します。 |
8 | previous(m) | mインデックスの前にインデックスを付けます。 |
9 | トリム | コレクションの最後から要素を削除します。 |
10 | トリム(m) | コレクションの最後からm個の要素を削除します。 |
十一 | 削除 | コレクションからすべての要素を削除し、カウントを0に設定します。 |
12 | delete(m) | コレクションからm番目の要素を削除します。m番目の要素がNULLの場合、アクションは実行されません。 |
13 | delete(m、k) | m番目からk番目の位置から要素を削除します。 |
14 | extend(m) | コレクションの最後にm要素を追加します。 |
15 | extend(m、k) | k番目の要素のm個のコピーをコレクションの最後に追加します。 |
コレクションの例外
一般的なコレクションの例外のいくつかは次のとおりです。
- VALUE_ERROR: この例外は、添え字をキータイプに変換できない場合、またはNULLの場合にスローされます。この例外は通常、キーのタイプがPLS_INTEGERの範囲であり、添え字がこの範囲を超えている場合に発生します。
- 何もデータが見つかりませんでした: この例外は、SELECT文が行をフェッチしないか、プログラムがネストされた表で削除された要素を指している場合にPL / SQLによってスローされます。この例外は、index-byテーブルで初期化されていない要素によっても発生する可能性があります。
- COLLECTION_IS_NULL: コレクションがデフォルトでNULLの場合、この例外はPL / SQLによってスローされます。
- SUBSCRIPT_BEYOND_COUNT: この例外は、添え字がコレクション内の要素数の総数よりも多い場合にスローされます。
- SUBSCRIPT_OUTSIDE_LIMIT: この例外は、添え字がしきい値の範囲を超えた場合にスローされます。
PL / SQLのネストされたテーブル
ネストされたテーブルは、単一列のデータベーステーブル、または配列サイズが動的である1次元配列のようなものです。その添え字は数値型です。行に1で始まる添え字を付けることで、ネストされたテーブルを変数に入れることができます。この機能により、配列のように性質が似ています。
ネストされたテーブルは、データベースの列に保持できます。また、テーブルを結合してSQL操作を操作するためにも使用できます。動的配列に似ているため、上限は任意のサイズにすることができます。
ネストされたテーブルは、密なコレクション特性と疎なコレクション特性の両方を持つことができます。つまり、DELETEプロシージャを使用して、任意の要素をランダムに削除(スパースにする)できます。データを削除するとインデックスに不連続性が生じますが、NEXT関数は次の添え字を繰り返すのに役立ちます。データはテーブルの形式で格納されるため、SELECTステートメントを使用して取得できます。
ネストされた表は、スキーマ・レベルまたはPL / SQLブロックで作成できます。これは、データベースまたはサブプログラム内でアクセス可能なデータベースオブジェクトのようなものです。
配列とネストされたテーブルの違いを以下に示します。
- ネストされたテーブルのサイズは動的に増やすことができます。配列の上限は固定されていますが、ネストされたテーブルでは固定されていません。
- 配列には連続した添え字があり、密度が高くなっています。ただし、ネストされたテーブルは作成時には密ですが、その間に要素が削除されると疎になります。
ネストされたテーブルの構文:
TYPE <> IS TABLE OF <> (NOT NULL);
ここに、 'タイプ' 型指定子です。 '素子' データ型です。
ネストされたテーブルを使用したコードの実装:
DECLARE TYPE subject IS TABLE OF VARCHAR(15); TYPE teacher IS TABLE OF VARCHAR2(20); subjectnames subject; subjectteacher teacher; summ integer; BEGIN -- adding subject and its teachers to the table subjectnames := subject('PLSQL', 'SELENIUM', 'JMETER'); subjectteacher:= teacher('Sashi', 'Mala', 'Mukund'); -- returns count of number of elements in nested table summ:= subjectteacher.count; -- printing the content to the console dbms_output.put_line('Total Number of Teachers: '|| summ); FOR i IN 1 .. summ LOOP dbms_output.put_line('Subject:'||subjectnames(i)||', Teacher:' || subjectteacher(i)); end loop; END;
上記のコードの出力は次のようになります。
連想配列またはインデックス-テーブル別
index-byテーブルは、一般に連想配列と呼ばれます。構造に関しては、index-byテーブルとネストされたテーブルの両方が類似しており、要素にアクセスするための添え字があります。
連想配列は、キーと値のペアで表されます。一意のキーはそれぞれ、配列内の値を識別するために使用されます。キーのデータ型は、作成時に定義された文字列または整数にすることができます。初めて値を割り当てるだけで、キーがindex-byテーブルに追加されます。同じエントリを変更するには、同じキーを使用する必要があります。
キーは、テーブルの主キーとして、または文字列を組み合わせて一意の値を作成することにより、一意のキーである必要があります。このタイプのコレクションの配列サイズは動的であり、特性がまばらまたは密です。 index-byテーブルとネストされたテーブルの違いの1つは、前者はデータベースの列に格納できませんが、ネストされたテーブルは格納できることです。
連想配列は、添え字の保守を容易にし、PL / SQLブロック内に作成されます。これは、主キーを使用して値を取得するSQLテーブルのようなものです。これは通常、一時的なデータストレージに使用され、SQLテーブルの代わりに使用して、SQLテーブルに必要なネットワークトラフィックとディスクストレージを回避できます。
連想配列は永続データを格納しないため、SELECTやINSERTなどのSQLステートメントでは使用できません。ただし、データ型をパッケージとして宣言し、パッケージの本体内で定義することにより、データベースのセッションで終了しないようにすることができます。
index-byテーブルの構文:
TYPE type IS TABLE OF element (NOT NULL) INDEX BY (BINARY_INTEGER | PLS_INTEGER | VARCHAR2(size)); INDEX BY key;
ここでは、 'キー' 数値です。 BINARY_INTEGERまたはPLS_INTEGERのいずれかです。そのデータ型は、varchar、varchar2、long、またはstringです。 varcharベースのキーは長さとともに記載する必要があります。
'素子' データ型です。
'サイズ' 要素の最大数です。正の整数です。
'タイプ' 型指定子です。
index-byテーブルを使用したコードの実装:
DECLARE TYPE age IS TABLE OF NUMBER INDEX BY VARCHAR(25); age_empl age; employee VARCHAR(25); BEGIN -- adding employee details to the table age_empl('Sam') := 30; age_empl('Venu') := 35; -- printing the table contents in the console employee := age_empl.FIRST; WHILE employee IS NOT null LOOP dbms_output.put_line ('Employee name is ' || employee || ' and age is ' || TO_CHAR(age_empl(employee))); employee := age_empl.NEXT(employee); END LOOP; END; /
上記のコードの出力は次のようになります。
PL / SQLのVARRAY
Varrayは固定数の要素を格納し、1次元配列のようなものです。ただし、要素の数は実行時に変更できます。これは、同様のデータ型の要素の連続セットです。これは、SQLステートメントを使用して処理できるデータベーステーブルに格納できます。ただし、このプロセスは、ネストされたテーブルほど簡単で柔軟ではありません。
Varrayの最大サイズは、そのタイプ定義で定義されています。 1つの添え字で始まるメモリ配置が次々にあり、最小のロケーションアドレスは開始要素を指し、最高のロケーションアドレスは終了要素を指します。 Varrayのすべての要素は、インデックスで識別されます。
このタイプのコレクションには数値の添え字があり、密な特性があります。したがって、その間に配列要素を削除することはできません。 Varray全体を削除するか、その端をトリミングする必要があります。密度が高いため、使用の柔軟性が低くなります。
Varrayは、PL / SQLブロック内またはスキーマのレベルで作成できます。これは、データベース内またはサブプログラム内でアクセスできるデータベースオブジェクトとして扱われます。 Varrayは、配列のサイズがわかっている場合に、より頻繁に使用されます。それらを使用する前に初期化する必要があり、コンストラクターを使用して初期化できます。その値は宣言時にNULLであり、その要素を参照する前に初期化する必要があります。
Varrayの構文:
TYPE <> IS VARYING ARRAY (<>) OF <> (NOT NULL);
ここに、
'タイプ' 型指定子です。
'素子' データ型です。
'サイズ' 配列内の要素の最大数です。正の整数です。
Varray変数の宣言と初期化
Varrayを作成した後、以下に説明する方法で宣言できます。
構文:
name type_n (:= type_n(...));
ここに、
'名前' Varrayの名前です。
‘type_n’ Varrayのタイプです。
‘type_n(…)’ Varray型のコンストラクターです。引数リストは、コンマ区切りでVarray型で示されます。
Varray変数を使用する前に初期化する必要があります。そうしないと、初期化されていない収集エラーが発生します。初期化は以下の方法で行います。
構文:
name type_n := type_n();
これにより、変数がゼロ要素で初期化されます。 varray変数に要素を設定するために、 構文は次のとおりです。
name type_n := type_n(e1, e2, ...);
Varrayの要素へのアクセス
これらの要素には、以下に説明するプロセスでアクセスできます。
名前(m); ここで、mは、1で始まり、Varrayタイプの要素数の最大カウントで終わる要素インデックスです。 mが1の範囲と要素数の最大数を超えている場合、 SUBSCRIPT_BEYOND_COUNT PL / SQLによって例外がスローされます。
Varrayのサイズは、ALTERステートメントを使用して変更できます。
ALTERを使用したコード実装。
CREATE Or REPLACE TYPE names AS VARRAY(2) OF VARCHAR(5); /
上記のコードの出力は次のようになります。
c ++グラフ隣接リスト
Varrayを使用したコードの実装:
DECLARE type countrynames IS VARRAY(3) OF VARCHAR2(50); type currency IS VARRAY(3) OF VARCHAR2(15); country countrynames; cur currency; addition integer; BEGIN -- adding country and its currency to the table country := countrynames('INDIA', 'USA', 'UK'); cur:= currency('INR', 'DOLLAR', 'POUND'); -- returns count of number of countries in varray addition := country.count; -- printing the content to the console dbms_output.put_line('Total Number of countries : '|| addition); FOR i in 1 .. addition LOOP dbms_output.put_line('Country: ' || country(i) || ' ,Currency : ' || cur(i)); END LOOP; END; /
上記のコードの出力は次のようになります。
Varrayとネストされたテーブルの違い
違いは次のとおりです。
- 要素の数がわかっていて、それらが順番に配置されているシナリオに取り組んでいる間、Varrayが一般的に使用されます。データベースに保存されているVarrayは、添え字とシーケンスを維持します。常に単一のオブジェクトとして維持されます。一方、ネストされたテーブルは、要素の数が制限されていない場合に使用されます。
- ネストされたテーブルにはスパース特性があり、要素を任意の位置から削除できますが、常に最後から削除できるとは限りません。ネストされたテーブルの順序と添え字は、データベースに保存されるときに維持されません。 Varrayの要素は常に順番に維持されます。
連想配列とネストされたテーブルの違い
違いは次のとおりです。
- ネストされたテーブルはデータベースの列に格納できますが、連想配列は格納できません。ネストされたテーブルは、永続的に保存される適切なデータ関係を維持します。
- 連想配列は、パッケージが初期化されるか、プロシージャが呼び出されるたびにコレクションをメモリに組み込むことができる小さなルックアップテーブルに適しています。サイズが事前にわからない場合に適しています。連想配列のインデックス値は、この配列の添え字が順番になっていないか、負または数値の代わりに文字列である可能性があるため、柔軟性があります。
よくある質問と回答
Q#1)PL / SQLでコレクションを使用するのはなぜですか?
回答: コレクションには、ネストされたテーブル、連想配列、およびVarrayの3つのタイプがあります。ネストされたテーブルには、ランダムな数の要素を格納できます。 Varrayは固定数の要素を格納でき、連想配列を使用すると、乱数と文字列を使用して要素を検索できます。
Q#2)PL / SQLのネストされたテーブルとは何ですか?
回答: ネストされたテーブルは本質的に1次元であり、そのサイズは固定されたままではありません。これらは、SQLおよびPL / SQLブロックでアクセスできます。レコード、オブジェクト定義、およびテーブルで利用できます。
Q#3)Oracle PL / SQLの一括コレクションとは何ですか?
回答: 一括コレクションは、PL / SQLエンジンがSQLエンジンに一度に複数の行を累積し、それらをコレクションに格納するように通知するときにデータを取得する方法です。
Q#4)Oracleで一括収集が高速なのはなぜですか?
回答: 一括収集は、PL / SQLエンジンとデータベース間の相互作用を削減することにより、パフォーマンスを向上させます。
Q#5)PL / SQLのVarrayとは何ですか?
回答: これは、同じデータ型の要素の同種のコレクションをシーケンスに格納するために使用されるPL / SQLデータ構造です。これは主に、順序付けられたデータセットを保持するために使用されます。
Q#6)OracleのVarrayから要素を削除できますか?
回答: SQLステートメントを直接使用してVarrayの要素を変更または削除することはできません。テーブルからVarrayを選択し、PL / SQLで変更してから、テーブルを変更して新しいVarrayに格納する必要があります。
Q#7)ネストされたテーブルとVarrayの違いは何ですか?
回答:違いは以下のとおりです。
- 要素の数が以前からわかっている場合は、Varrayを使用します。この制限は、ネストされたテーブルでは使用できません。
- Varrayでは、要素は順番に使用されます。ネストされたテーブルには、密な特性と疎な特性の両方があります。
- 要素は常にVarrayで順序付けられます。要素は、ネストされたテーブルで順番になっている場合とそうでない場合があります。
結論
このチュートリアルでは、PL / SQLに関する知識の開発に不可欠なPL / SQLの基本概念のいくつかについて詳しく説明しました。
以下のトピックについて説明しました。
- PL SQLコレクション(メソッドと例外)の基本的な理解。
- ヴァレー。
- ネストされたテーブル
- インデックスバイテーブル
<< PREV Tutorial | 次のチュートリアル>>