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>
適切な収集タイプを選択すると、特定のニーズに依存します。レコードは、関連するデータ要素、順序付けられたリスト用のネストされたテーブル、キー価値の検索用の連想配列のグループ化に最適です。
さまざまなコレクションタイプを使用することのパフォーマンスへの影響は、使用方法とデータのサイズによって異なります。一般的に:
コレクションのサイズと操作の頻度(挿入、削除、ルックアップ)は、全体的なパフォーマンスに大きく影響します。非常に大きなデータセットについては、アクセスパターンを最適化し、具体化されたビューやパイプライン化された関数などの代替アプローチを使用する可能性を検討してください。
パラメーターとしてコレクションを効率的に渡すには、さまざまな通過モード(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コードの効率を大幅に改善できます。
改善された効率の例:
この非効率的なアプローチの代わりに:
<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 サイトの他の関連記事を参照してください。