2011/07/29 01:00:43

ガバナ制限処方箋(7):IN句に配列をバインドする

このエントリーをはてなブックマークに追加

今週は、IN句を利用してSOQLクエリの発行回数、実行するステートメント数(コーディング量)を減らす方法について説明します。
組織に割り当てられたコーディング量が上限に達するまでForce.comを使い切る方は少ないと思いますが、日頃から気をつけておくに越したことはありません。SOQLクエリの発行回数、実行するステートメント数についてはCSVデータ出力やバッチ処理で大量データを処理する場合などではガバナ制限にかかってしまうことがあります。その場合は、サブクエリーを駆使したり、今回紹介する方法を使ったり、はたまたアルゴリズム自体を見直したりして、ガバナ制限を回避する方法を模索することになります。

今回の処方箋で関係するガバナ制限としては、以下のようなものになります。

説明 制限
1回のトランザクションで実行できるSOQLクエリの合計回数 100
1回のトランザクションで実行可能なステートメント数 200,000

※2011年7月29日時点(最新情報は、セールスフォース・ドットコム社からご覧ください)

前置きが長くなりましたが説明を始めます。IN句を利用する場合、クエリを文字列で構築し、Database.query(‘[クエリ]‘)メソッドを利用し、動的にSOQLを実行する方法もありますが、SOQL独自のやり方としてsObject型の配列をバインドする方法が便利です。

基本的な考え方は、RDBMSのSQLにあるIN句と同様ですが、SOQLではList型の変数を条件に指定できます。OQLだけでは抽出しきれない場合や他の処理でIDを抽出した結果を再利用する場合などで利用できます。
先に紹介したクエリ文字列を構築する方法では、文字列を組み立てるためにコーディング量、実行するステートメント数が増えてしまいます。しかし、配列をバインドする方法を利用することで、コーディング量、実行するステートメント数の両方を抑えることができます。

以下にサンプルソースコードを示します。

// 適当なIDを格納したリストを準備する
List<Account> conditions = [SELECT id, name FROM Account LIMITS 5];

for(List<Account> accounts : [SELECT id, name FROM Account WHERE ID IN :conditions]) {
	for(Account account : accounts) {
		// 対象データに対する操作
		// ・・・
		System.debug(account.name);
	}
	// 対象データに対するDMLなど
	update accounts;
}

4行目が、配列をバインドしている箇所になります。1行目で取得したリストをバインドしてSOQLを発行しています。
文法自体は簡単なので覚えてしまえば迷うことはないでしょう。

そろそろネタも尽きてきましたので、週間連載は一旦終了としたいと思います。また、ネタがあれば都度記事をまとめていこうと思います。

「スタッフブログ」へのコメントやご意見等ありましたら、 Facebookページまでお願いします。
twitterでもつぶやいてます。ご興味のある方はぜひフォロー、「いいね!」をお願いします。

(倉谷)

admin
Page topへ