プリペアドステートメントのサポートを使用する - Amazon Redshift

プリペアドステートメントのサポートを使用する

Amazon Redshift JDBC ドライバーは、プリペアドステートメントをサポートしています。プリペアドステートメントを使用すると、同じ接続中に複数回実行する必要がある、パラメータ化されたクエリのパフォーマンスを向上できます。

プリペアドステートメントは、サーバー側でコンパイルされますが、すぐには実行されない SQL ステートメントです。コンパイルされたステートメントは、オブジェクトまたは接続を閉じるまで、PreparedStatement オブジェクトとしてサーバーに保存されます。そのオブジェクトが存在している間は、ステートメントを再度コンパイルすることなく、異なるパラメータ値を使用して必要な回数だけプリペアドステートメントを実行できます。これによってオーバーヘッドが軽減され、一連のクエリをより迅速に実行することが可能になります。

プリペアドステートメントの詳細については、Oracle からの JDBC の基礎チュートリアルの「プリペアドステートメントの使用」を参照してください。

複数のクエリを含むステートメントを準備できます。例えば、次のプリペアドステートメントには、2 つの INSERT クエリが含まれています。

PreparedStatement pstmt = conn.prepareStatement("INSERT INTO MyTable VALUES (1, 'abc'); INSERT INTO CompanyTable VALUES (1, 'abc');");

これらのクエリは、同じプリペアドステートメント内で指定された他のクエリの結果に依存しないように注意してください。準備ステップの間はクエリが実行されないため、結果はまだ返されておらず、同じ準備済みステートメント内の他のクエリでは使用できません。

例えば、テーブルを作成してから、新しく作成されたテーブルに値を挿入する次のプリペアドステートメントは許可されていません。

PreparedStatement pstmt = conn.prepareStatement("CREATE TABLE MyTable(col1 int, col2 varchar); INSERT INTO myTable VALUES (1, 'abc');");

このステートメントを準備しようとすると、サーバーは送信先のテーブル (myTable) がまだ存在していないことを示すエラーを返します。INSERT クエリを準備する前に、CREATE クエリを実行する必要があります。