ホームページ >データベース >Oracle >PL/SQL(配列、レコード、テーブル)でコレクションを使用するにはどうすればよいですか?

PL/SQL(配列、レコード、テーブル)でコレクションを使用するにはどうすればよいですか?

Johnathan Smith
Johnathan Smithオリジナル
2025-03-13 13:15:17297ブラウズ

PL/SQLでコレクションの使用方法(配列、レコード、テーブル)

PL/SQLは、関連データのグループを管理するためのいくつかのコレクションタイプを提供し、コード効率と読みやすさを向上させます。これらには、ネストされたテーブル、連想配列(インデックスごとのテーブル)、およびレコードが含まれます。それぞれを調べてみましょう:

記録:レコードは、他の言語の構造に似ています。それらは、単一の名前で異なるデータ型の要素をグループ化します。それらはTYPEステートメントで宣言され、変数を宣言するために使用されます。

 <code class="sql">DECLARE TYPE employee_record IS RECORD ( employee_id NUMBER, employee_name VARCHAR2(50), salary NUMBER ); emp employee_record; BEGIN emp.employee_id := 123; emp.employee_name := 'John Doe'; emp.salary := 60000; DBMS_OUTPUT.PUT_LINE('Employee ID: ' || emp.employee_id); END; /</code>

ネストされたテーブル:ネストされたテーブルは、均一なデータ型のコレクションを注文します。それらは可変長リストを可能にします。

 <code class="sql">DECLARE TYPE num_list IS TABLE OF NUMBER; numbers num_list := num_list(1, 2, 3, 4, 5); BEGIN FOR i IN numbers.FIRST .. numbers.LAST LOOP DBMS_OUTPUT.PUT_LINE(numbers(i)); END LOOP; END; /</code>

連想配列(インデックスごとのテーブル):これらは、他の言語のハッシュマップまたは辞書に似ています。キー価値のペアを保存します。キーはPLS_INTEGERのサブタイプである必要があり、値は任意のデータ型になります。

 <code class="sql">DECLARE TYPE emp_salary IS TABLE OF NUMBER INDEX BY VARCHAR2(50); salaries emp_salary; BEGIN salaries('John Doe') := 60000; salaries('Jane Smith') := 75000; DBMS_OUTPUT.PUT_LINE('John Doe salary: ' || salaries('John Doe')); END; /</code>

適切な収集タイプを選択すると、特定のニーズに依存します。レコードは、関連するデータ要素、順序付けられたリスト用のネストされたテーブル、キー価値の検索用の連想配列のグループ化に最適です。

PL/SQLで異なるコレクションタイプを使用することのパフォーマンスの影響は何ですか?

さまざまなコレクションタイプを使用することのパフォーマンスへの影響は、使用方法とデータのサイズによって異なります。一般的に:

  • 記録:レコードは、本質的に単なる構造であるため、パフォーマンスの間接的なパフォーマンスを最小限に抑えます。個々の要素へのアクセスは高速です。
  • ネストされたテーブル:パフォーマンスは、ネストされたテーブルのサイズによって影響を受ける可能性があります。ネストされた大きなテーブルへのアプリテンディング要素のような操作は、小さなテーブルでの同等の操作よりも遅い場合があります。また、インデックスごとに特定の要素を取得することは、値で要素を検索するよりも速い場合があります。
  • 連想配列:キーによる要素へのアクセスは一般に非常に高速であり、頻繁な検索に最適です。ただし、ハッシュ衝突の可能性があるため、パフォーマンスは非常に大きな配列で劣化する可能性があります。連想配列を介した反復は、ネストされたテーブルを介した反復よりも遅くなります。

コレクションのサイズと操作の頻度(挿入、削除、ルックアップ)は、全体的なパフォーマンスに大きく影響します。非常に大きなデータセットについては、アクセスパターンを最適化し、具体化されたビューやパイプライン化された関数などの代替アプローチを使用する可能性を検討してください。

パラメーターとしてPL/SQL手順と機能にコレクションを効率的に渡すにはどうすればよいですか?

パラメーターとしてコレクションを効率的に渡すには、さまざまな通過モード(in、out、in out)を理解し、ニーズに基づいて適切な方法を選択することが含まれます。必要に応じて%ROWTYPE属性を使用すると、パフォーマンスも向上します。

パラメーターでは、これはコレクションを渡す最も一般的な方法です。コレクションは、読み取り専用値として渡されます。手順または関数は、コレクションのコピーを受け取ります。これは、小規模なコレクションでは効率的ですが、非常に大きなコレクションでは効率が低くなります。

アウトパラメーター:手順または関数がコレクションを変更し、変更されたバージョンを返します。

OUTパラメーター:コレクションは、手順または機能内で渡され、変更され、変更されたバージョンが返されます。

パラメーターでの使用例:

 <code class="sql">CREATE OR REPLACE PROCEDURE process_numbers (numbers IN num_list) IS BEGIN -- Process the numbers collection END; /</code>

非常に大きなコレクションについては、コレクションを直接渡すのではなく、オブジェクトタイプを使用して参照で渡すことを検討してください。これにより、大規模なデータセットをコピーするメモリオーバーヘッドを減らすことができます。

コレクションを使用してPL/SQLコードの効率を向上させることはできますか?

はい、コレクションはいくつかの方法でPL/SQLコードの効率を大幅に改善できます。

  • コンテキストの切り替えの削減:個々の行全体を取得するために複数のデータベース呼び出しを行う代わりに、コレクション全体を1回の呼び出しで取得して、PL/SQLとデータベースの間のオーバーヘッドをコンテキストスイッチングすることができます。
  • バッチ処理:コレクションを使用すると、単一のステートメントで複数の行の挿入や更新など、バッチ操作を実行し、個々の列ごとの処理と比較してパフォーマンスを大幅に改善できます。
  • 読みやすさと保守性の向上:コレクションを使用して関連データをグループ化すると、コードの読みやすさが向上し、維持が容易になります。
  • 最適化されたデータ取得:関連データをコレクションに取得することにより、同じデータの繰り返しデータベースルックアップを避けることができます。これは、マスターデテールの関係を扱うときに特に役立ちます。

改善された効率の例:

この非効率的なアプローチの代わりに:

 <code class="sql">FOR i IN 1..1000 LOOP SELECT column1 INTO variable1 FROM table1 WHERE id = i; -- Process variable1 END LOOP;</code>

ネストされたテーブルを使用して、このより効率的なアプローチを使用してください。

 <code class="sql">DECLARE TYPE num_list IS TABLE OF NUMBER; data num_list; BEGIN SELECT id BULK COLLECT INTO data FROM table1 WHERE id BETWEEN 1 AND 1000; FOR i IN data.FIRST .. data.LAST LOOP -- Process data(i) END LOOP; END; /</code>

BULK COLLECT INTO使用することにより、単一のデータベースラウンドトリップで1000個すべてのIDを取得し、パフォーマンスを大幅に改善します。この原則は、他のデータベース操作にも適用されます。データ構造とアクセスパターンに基づいて、最適なパフォーマンスのために適切な収集タイプを選択してください。

以上がPL/SQL(配列、レコード、テーブル)でコレクションを使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。