FETCHINTOステートメントを使用した一括収集句
前のチュートリアルでは、SELECT-INTOステートメントでPL / SQL Bulk Collectを使用して、複数のコンテキストスイッチを1つに圧縮することができました。 SELECT-INTOステートメントはSQL標準クエリです。つまり、開発者はステートメントの実行をあまり制御できません。
クエリのパフォーマンスについて話す場合、SELECT-INTOステートメントで範囲を超えることはできません。 SELECT-INTOステートメントのこれらすべての欠点をどのように克服できるか見てみましょう。
このブログでは、明示カーソルのFETCH-INTOステートメントでBulkCollect句を使用する方法を学習します。 FETCHステートメントはカーソルのライフサイクルの一部であるため、このチュートリアルをよりよく理解するには、明示カーソルの実用的な知識が必要です。同じように、Oracleデータベースで明示カーソルを作成する方法に関するチュートリアルを確認できます。
FETCHINTOステートメントでBulkCollect句を使用する必要があるのはなぜですか?
前のブログで述べたように、SELECT-INTOステートメントでBulk-Collectを使用する場合は常に、ランタイムエンジンは暗黙カーソルを使用してタスクを処理します。ただし、FETCH-INTOステートメントでBulk Collectを使用する場合、ランタイムエンジンは明示カーソルを使用してタスクを処理します。
明示カーソルは、標準のSQLクエリを事前に制御するのに常に役立ちます。たとえば、明示カーソルを使用すると、レコードをフェッチするタイミングや一度に取得するレコードの数を制御できますが、SELECT-INTOステートメントの場合はこれは不可能です。
Fetch-Intoステートメントを使用した一括収集の構文は何ですか?
SELECT-INTOステートメントと同様に、bulkcollect句はFETCH-INTOステートメントの属性として機能します。構文は次のとおりです
FETCH <cursor_name> BULK COLLECT INTO <plsql_collection>;
FETCHステートメントは明示カーソルの一部です。親カーソルを宣言せずに実行しようとすると、エラーが発生します。また、一括収集でサポートされている構造はPL/SQLコレクションのみであることを常に忘れないでください。
例:OracleデータベースでFETCH-INTOステートメントを使用してPL/SQL一括収集を使用する方法。
SET SERVEROUTPUT ON; DECLARE --Create an explicit cursor CURSOR exp_cur IS SELECT first_name FROM employees; --Declare collection for holding the data TYPE nt_fName IS TABLE OF VARCHAR2 (20); fname nt_fName; BEGIN OPEN exp_cur; LOOP FETCH exp_cur BULK COLLECT INTO fname; EXIT WHEN fname.count=0; --Print data FOR idx IN fname.FIRST.. fname.LAST LOOP DBMS_OUTPUT.PUT_LINE (idx||' '||fname(idx) ); END LOOP; END LOOP; CLOSE exp_cur; END; /
このコード全体のすべての行について、YouTubeチャンネルのビデオチュートリアルで詳しく説明しました。このチュートリアルを見ることができます。
このコードでは、fetchintoステートメントでBulkCollect句を使用しているため、コンテキストの切り替えが問題にならないことを意味します。バルクコレクト句は、複数のスイッチを1つのスイッチに圧縮するため、パフォーマンスのボトルネックが発生することはありません。
しかし、それはこのコードが十分に最適化されており、それ以上の最適化を必要としないことを意味しますか?それとも、クエリのパフォーマンスが将来的に問題になることはありませんか?
これらすべての質問に対する回答を得るとともに、このPL/SQLプログラムをさらに最適化する方法を学ぶためにご期待ください。
このブログを楽しんでいただけたでしょうか。疑問や質問がある場合、または私がこのブログで何かを言及するのを忘れたと思う場合は、私のFacebookページまたはTwitterで私に書いてください。ありがとう、そして素晴らしい一日を!