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

queryMore()

query() からオブジェクトの次のバッチを取得します。

構文

1QueryResult = connection.queryMore( QueryLocator  QueryLocator);

使用方法

このコールを使用して query() コールを処理し、結果セット内に大量のレコード (通常 500 超) を取得します。query() コールは、最初の 500 レコードを取得し、queryLocator オブジェクト内にサーバ側カーソルを作成します。queryMore() コールは、最大 500 レコードのチャンクまで後続のレコードを処理し、新規に生成された QueryLocator を返します。結果セット内のレコードを反復処理するために、一般的には、すべての結果セット内のレコードが処理される (Done フラグが true になる) まで、queryMore() を繰り返しコールします。返されるレコードの最大数は最高 2,000 にまで変更可能です。詳細は、『Salesforce SOQL および SOSL リファレンスガイド』の「クエリのバッチサイズの変更」を参照してください。

クエリに GROUP BY 句がある場合、queryMore() を使用できません。詳細は、『Salesforce SOQL および SOSL リファレンスガイド』の「GROUP BY」および「queryMore()」を参照してください。

親オブジェクトの queryMore() コールは、前の結果セット内のすべての子カーソルを無効にします。子オブジェクトからの結果が必要な場合は、親オブジェクトの結果に queryMore() を使用する前に、子オブジェクトの結果に queryMore() を使用する必要があります。

メモ

外部オブジェクトをクエリするとき、Salesforce Connect は Web サービスコールアウト経由で外部データにリアルタイムにアクセスします。queryMore() コールを実行するたびに、Web サービスコールアウトが行われます。バッチの区切りとページサイズは、アダプタと外部データソースの設定方法に応じて異なります。

次の設定をお勧めします。
  • 可能ならば、外部オブジェクトのクエリを、デフォルトのバッチサイズである 500 行よりも少ない行を返すように絞り込んでページングを避けます。バッチを取得するたびに queryMore() コールが必要になり、その結果、Web サービスコールアウトが行われます。
  • 外部データが頻繁に変更される場合は、queryMore() コールの使用を避けてください。次の queryMore() コールまでの間に外部データが変更された場合、予期しない QueryResult になることがあります。

SELECT ステートメントの主オブジェクト (「主導」オブジェクト) が外部オブジェクトの場合、queryMore() は主オブジェクトのみをサポートし、サブクエリをサポートしません。

デフォルトでは、Salesforce Connect の OData 2.0 および 4.0 アダプタは、クライアント駆動のページングを使用します。クライアント駆動ページングにより、OData アダプタは各 queryMore() コールを、$skip および $top システムクエリオプションを使用してバッチの区切りとページサイズを指定する OData クエリに変換します。これらのオプションは、LIMIT および OFFSET 句を使用した結果セットのページ処理に似ています。外部データソースのサーバ駆動ページングを有効にすると、要求されたページサイズ (デフォルトの queryMore() バッチサイズの 500 行を含む) が Salesforce で無視されます。バッチは、外部システムによって返されるページで決まります。

サンプルコード —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 クエリ結果セットにおいて、現在の処理位置を追跡するサーバ側のカーソルを表します。

応答

QueryResult