SOQL for loops iterate over all of the
sObject records returned by a SOQL query.
The syntax of a SOQL
for loop is
either:
or
Both
variable and
variable_list must be of the same type as the sObjects
that are returned by the
soql_query. As in standard SOQL queries, the
[soql_query] statement can refer
to code expressions in their
WHERE clauses
using the
: syntax. For
example:
The following example combines creating a list from a SOQL query, with the DML
update
method.
SOQL For Loops Versus Standard SOQL Queries
SOQL for loops differ from standard SOQL
statements because of the method they use to retrieve sObjects. While the standard
queries discussed in SOQL and SOSL Queries can retrieve either the count of a query or a number of object records,
SOQL for loops retrieve all sObjects, using
efficient chunking with calls to the query
and queryMore methods of the SOAP API.
Developers should always use a SOQL for
loop to process query results that return many records, to avoid the limit on heap size.
Note that queries including an aggregate function don't support queryMore. A run-time exception occurs if you
use a query containing an aggregate function that returns more than 2,000 rows in a
for loop.
SOQL For Loop Formats
SOQL
for loops can process records one at a
time using a single sObject variable, or in batches of 200 sObjects at a time using an sObject list:
- The single sObject format executes the for loop's <code_block> once per sObject record. Consequently, it is
easy to understand and use, but is grossly inefficient if you want to use
data manipulation language (DML) statements within the for loop body. Each DML statement ends
up processing only one sObject at a time.
- The sObject list format executes the for loop's <code_block> once per list of 200 sObjects. Consequently, it is a little more difficult to understand and
use, but is the optimal choice if you need to use DML statements within the
for loop body. Each DML
statement can bulk process a list of sObjects at a time.
For example, the following code illustrates the difference between the two types of
SOQL query
for loops:
- The break and continue keywords can be used in both
types of inline query for loop
formats. When using the sObject list format, continue skips to the next list of sObjects.
- DML statements can only process up to 10,000 records at a time, and sObject list for loops process records in batches of 200. Consequently, if
you are inserting, updating, or deleting more than one record per returned
record in an sObject list for loop, it
is possible to encounter runtime limit errors. See Execution Governors and
Limits.
- You might get a QueryException in a
SOQL for loop with the message Aggregate query has too many rows for direct
assignment, use FOR loop. This exception is sometimes thrown
when accessing a large set of child records (200 or more) of a retrieved
sObject inside the loop, or when getting the size of such a record set. For
example, the query in the following SOQL for loop retrieves child contacts for a particular account. If
this account contains more than 200 child contacts, the statements in the
for loop cause an exception.
To
avoid getting this exception, use a for loop to iterate over the child records, as
follows.