この文章は 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() を使用する必要があります。

メモ

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

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

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

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

サンプルコード —Java

このサンプルでは、すべての取引先責任者の名および姓を取得するクエリを実行します。クエリ文字列を渡して、query() をコールし、レコードの最初のバッチを取得します。次に、ループで queryMore() をコールして、レコードが返されなくなるまで、後続のバッチを取得します。クエリした取引先責任者の名と姓をコンソールに書き込みます。

1swfobject.registerObject("clippy.codeblock-1", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public void queryRecords() {
18   QueryResult qResult = null;
19   try {
20      String soqlQuery = "SELECT FirstName, LastName FROM Contact";
21      qResult = connection.query(soqlQuery);
22      boolean done = false;
23      if (qResult.getSize() > 0) {
24         System.out.println("Logged-in user can see a total of "
25            + qResult.getSize() + " contact records.");
26         while (!done) {
27            SObject[] records = qResult.getRecords();
28            for (int i = 0; i < records.length; ++i) {
29               Contact con = (Contact) records[i];
30               String fName = con.getFirstName();
31               String lName = con.getLastName();
32               if (fName == null) {
33                  System.out.println("Contact " + (i + 1) + ": " + lName);
34               } else {
35                  System.out.println("Contact " + (i + 1) + ": " + fName
36                        + " " + lName);
37               }
38            }
39            if (qResult.isDone()) {
40               done = true;
41            } else {
42               qResult = connection.queryMore(qResult.getQueryLocator());
43            }
44         }
45      } else {
46         System.out.println("No records found.");
47      }
48      System.out.println("\nQuery succesfully executed.");
49   } catch (ConnectionException ce) {
50      ce.printStackTrace();
51   }
52}

サンプルコード —C#

このサンプルでは、すべての取引先責任者の名および姓を取得するクエリを実行します。クエリ文字列を渡して、query() をコールし、レコードの最初のバッチを取得します。次に、ループで queryMore() をコールして、レコードが返されなくなるまで、後続のバッチを取得します。クエリした取引先責任者の名と姓をコンソールに書き込みます。

1swfobject.registerObject("clippy.codeblock-2", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public void queryRecords()
18{
19   QueryResult qResult = null;
20   try
21   {
22      String soqlQuery = "SELECT FirstName, LastName FROM Contact";
23      qResult = binding.query(soqlQuery);
24      Boolean done = false;
25      if (qResult.size > 0)
26      {
27         Console.WriteLine("Logged-in user can see a total of "
28            + qResult.size + " contact records.");
29         while (!done)
30         {
31            sObject[] records = qResult.records;
32            for (int i = 0; i < records.Length; ++i)
33            {
34               Contact con = (Contact)records[i];
35               String fName = con.FirstName;
36               String lName = con.LastName;
37               if (fName == null)
38               {
39                  Console.WriteLine("Contact " + (i + 1) + ": " + lName);
40               }
41               else
42               {
43                  Console.WriteLine("Contact " + (i + 1) + ": " + fName
44                        + " " + lName);
45               }
46            }
47            if (qResult.done)
48            {
49               done = true;
50            }
51            else
52            {
53               qResult = binding.queryMore(qResult.queryLocator);
54            }
55         }
56      }
57      else
58      {
59         Console.WriteLine("No records found.");
60      }
61      Console.WriteLine("\nQuery succesfully executed.");
62   }
63   catch (SoapException e)
64   {
65      Console.WriteLine("An unexpected error has occurred: " +
66                                 e.Message + "\n" + e.StackTrace);
67   }
68}

引数

名前 説明
queryLocator QueryLocator クエリ結果セットにおいて、現在の処理位置を追跡するサーバ側のカーソルを表します。

応答

QueryResult