queryMore()
構文
1QueryResult queryResult = connection.queryMore(queryLocator)queryMore() には queryLocator パラメータが必要です。このパラメータの値は、先行する query() で返されるクエリロケータ ID です。
使用方法
このコールは、query() または先行する queryMore() コールで多数の結果が返される場合に、その他の結果を取得するために使用します。query() および queryMore() コールは、最大 2,000 レコードをバッチで取得できます。結果の数が、1 つのバッチで返すことができる数より多い場合は、サーバ側のカーソルと QueryLocator が作成されます。クエリロケータは、QueryResult で返され、結果の次のバッチを探すために queryMore() で使用されます。
queryMore() コールは、追加のバッチの後続のレコードを処理し、サーバ側カーソルをリセットして、新規に生成されたクエリロケータを返します。結果セット内のレコードを反復処理するには、結果セット内のすべてのレコードが処理されて Done ��ラグが true になるまで、queryMore() を繰り返しコールします。
クエリに GROUP BY 句がある場合、queryMore() を使用できません。詳細は、『Salesforce SOQL および SOSL リファレンスガイド』の「GROUP BY」を参照してください。
外部オブジェクトを照会するとき、Salesforce Connect は Web サービスコールアウト経由で外部データにリアルタイムにアクセスし、queryMore() コールを実行するたびにコールアウトが行われます。バッチの区切りとページサイズは、アダプタと外部データ取得元の設定方法に応じて異なります。
- 外部オブジェクトのクエリを、デフォルトのバッチサイズである 2,000 行よりも少ない行を返すように絞り込んでページングを避けます。バッチを取得するたびに queryMore() コールが必要になり、その結果、Web サービスコールアウトが行われます。
- 外部データが頻繁に変更される場合は、queryMore() コールの使用を避けてください。次の queryMore() コールまでの間に外部データが変更された場合、予期しない QueryResult になることがあります。
SELECT ステートメントの主オブジェクトが外部オブジェクトの場合、queryMore() は主オブジェクトのみをサポートし、サブクエリをサポートしません。
Salesforce ヘルプの「Salesforce Connect — OData 2.0 および 4.0 アダプタのクライアント駆動ページングとサーバ駆動ページング」を参照してください。
サンプルコード — Java
このサンプルでは、すべての取引先責任者の名および姓を取得するクエリを実行します。クエリ文字列を渡して、query() をコールし、レコードの最初のバッチを取得します。次に、ループで queryMore() をコールして、レコードが返されなくなるまで、後続のバッチを取得します。照会した取引先責任者の名と姓をコンソールに書き込みます。
1public void queryRecords() {
2 QueryResult qResult = null;
3 try {
4 String soqlQuery = "SELECT FirstName, LastName FROM Contact";
5 qResult = connection.query(soqlQuery);
6 boolean done = false;
7 if (qResult.getSize() > 0) {
8 System.out.println("Logged-in user can see a total of "
9 + qResult.getSize() + " contact records.");
10 while (!done) {
11 SObject[] records = qResult.getRecords();
12 for (int i = 0; i < records.length; ++i) {
13 Contact con = (Contact) records[i];
14 String fName = con.getFirstName();
15 String lName = con.getLastName();
16 if (fName == null) {
17 System.out.println("Contact " + (i + 1) + ": " + lName);
18 } else {
19 System.out.println("Contact " + (i + 1) + ": " + fName
20 + " " + lName);
21 }
22 }
23 if (qResult.isDone()) {
24 done = true;
25 } else {
26 qResult = connection.queryMore(qResult.getQueryLocator());
27 }
28 }
29 } else {
30 System.out.println("No records found.");
31 }
32 System.out.println("\nQuery succesfully executed.");
33 } catch (ConnectionException ce) {
34 ce.printStackTrace();
35 }
36}サンプルコード — C#
このサンプルでは、すべての取引先責任者の名および姓を取得するクエリを実行します。クエリ文字列を渡して、query() をコールし、レコードの最初のバッチを取得します。次に、ループで queryMore() をコールして、レコードが返されなくなるまで、後続のバッチを取得します。照会した取引先責任者の名と姓をコンソールに書き込みます。
1public void queryRecords()
2{
3 QueryResult qResult = null;
4 try
5 {
6 String soqlQuery = "SELECT FirstName, LastName FROM Contact";
7 qResult = binding.query(soqlQuery);
8 Boolean done = false;
9 if (qResult.size > 0)
10 {
11 Console.WriteLine("Logged-in user can see a total of "
12 + qResult.size + " contact records.");
13 while (!done)
14 {
15 sObject[] records = qResult.records;
16 for (int i = 0; i < records.Length; ++i)
17 {
18 Contact con = (Contact)records[i];
19 String fName = con.FirstName;
20 String lName = con.LastName;
21 if (fName == null)
22 {
23 Console.WriteLine("Contact " + (i + 1) + ": " + lName);
24 }
25 else
26 {
27 Console.WriteLine("Contact " + (i + 1) + ": " + fName
28 + " " + lName);
29 }
30 }
31 if (qResult.done)
32 {
33 done = true;
34 }
35 else
36 {
37 qResult = binding.queryMore(qResult.queryLocator);
38 }
39 }
40 }
41 else
42 {
43 Console.WriteLine("No records found.");
44 }
45 Console.WriteLine("\nQuery succesfully executed.");
46 }
47 catch (SoapException e)
48 {
49 Console.WriteLine("An unexpected error has occurred: " +
50 e.Message + "\n" + e.StackTrace);
51 }
52}引数
| 名前 | 型 | 説明 |
|---|---|---|
| queryLocator | QueryLocator | データベースのサーバ側カーソルを指します。クエリ結果セットの現在の処理場所を追跡し、追加の結果の場所を示します。 クエリロケータは、ID に似た特殊な文字列です。長さは 18 文字で、プレフィックス 0r8 で始まります。クエリ結果から後続のオブジェクトセットを取得する場合に必要です。この引数は、必要に応じて使用します。 |