この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

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 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 で始まります。クエリ結果から後続のオブジェクトセットを取得する場合に必要です。この引数は、必要に応じて使用します。

応答

QueryResult