SqlRowIterator Class
Namespace
Usage
Use SqlRowIterator for queries that return manageable result sets within a single transaction's governor limits. The query isn't submitted until iteration begins or until getQueryId() is called. For large result sets that may exceed single-transaction governor limits, use SqlQueueable instead.
Example
Basic query using a for-each loop:
1sfsqlquery.SqlRowIterator iterator = sfsqlquery.SqlStatement.create('SELECT Id__c, Name__c FROM accounts__dlm LIMIT 100', 'default')
2 .execute();
3
4for (sfsqlquery.Row row : iterator) {
5 System.debug(row.getString('Id__c') + ': ' + row.getString('Name__c'));
6}Resume from a previously saved query ID:
1sfsqlquery.QueryHandle handle = sfsqlquery.QueryHandle.create('my-query-id-123', 'default')
2 .withOffset(500); // Skip first 500 rows already processed
3
4sfsqlquery.SqlRowIterator iterator = new sfsqlquery.SqlRowIterator(handle);
5while (iterator.hasNext()) {
6 sfsqlquery.Row row = iterator.next();
7 System.debug(row.getString('Name__c'));
8}SqlRowIterator Constructors
The following are constructors for SqlRowIterator.
SqlRowIterator(handle)
Signature
public SqlRowIterator(sfsqlquery.QueryHandle handle)
Parameters
- handle
- Type: sfsqlquery.QueryHandle
- QueryHandle built from a previously submitted query ID and data space.
SqlRowIterator(input)
Signature
public SqlRowIterator(sfsqlquery.SqlStatement input)
Parameters
- input
- Type: sfsqlquery.SqlStatement
- SqlStatement that defines the query to execute.
SqlRowIterator Methods
The following are methods for SqlRowIterator.
cancel()
Signature
public void cancel()
Return Value
Type: void
Example
Cancel the query based on a condition:
1sfsqlquery.SqlRowIterator iterator = sfsqlquery.SqlStatement.create('SELECT Id__c, Amount__c FROM accounts__dlm', 'default')
2 .execute();
3
4Decimal totalAmount = 0;
5for (sfsqlquery.Row row : iterator) {
6 Decimal amount = row.getDecimal('Amount__c');
7 if (amount != null) {
8 totalAmount += amount;
9 if (totalAmount > 1000000) {
10 iterator.cancel(); // Stop when threshold is reached
11 break;
12 }
13 }
14}getColumnNames()
Signature
public List<String> getColumnNames()
Example
See getMetadata() for a combined example.
getMetadata()
Signature
public List<ConnectApi.QuerySqlMetadataItem> getMetadata()
Return Value
Type: List<ConnectApi.QuerySqlMetadataItem>
A list of ConnectApi.QuerySqlMetadataItem objects describing each column's name and data type.
Example
Use metadata and column names for dynamic column handling:
1sfsqlquery.SqlRowIterator iterator = sfsqlquery.SqlStatement.create('SELECT * FROM accounts__dlm LIMIT 10', 'default')
2 .execute();
3
4List<String> columns = iterator.getColumnNames();
5List<ConnectApi.QuerySqlMetadataItem> metadata = iterator.getMetadata();
6
7System.debug('Query returned ' + columns.size() + ' columns');
8for (Integer i = 0; i < metadata.size(); i++) {
9 System.debug(columns[i] + ' (' + metadata[i].type + ')');
10}
11
12// Process rows using the metadata
13for (sfsqlquery.Row row : iterator) {
14 for (String columnName : columns) {
15 Object value = row.getObject(columnName);
16 System.debug(columnName + ': ' + value);
17 }
18}getQueryId()
Signature
public String getQueryId()
Example
Save query ID for resuming later:
1sfsqlquery.SqlRowIterator iterator = sfsqlquery.SqlStatement.create('SELECT Id__c FROM accounts__dlm', 'default')
2 .execute();
3
4String queryId = iterator.getQueryId();
5// Store queryId to resume in a later transactionhasNext()
Signature
public Boolean hasNext()
Example
Use in a while loop:
1sfsqlquery.SqlRowIterator iterator = sfsqlquery.SqlStatement.create('SELECT Name__c FROM accounts__dlm', 'default')
2 .execute();
3
4while (iterator.hasNext()) {
5 sfsqlquery.Row row = iterator.next();
6 System.debug(row.getString('Name__c'));
7}iterator()
Signature
public Iterator iterator()
next()
Signature
public sfsqlquery.Row next()
Example
Process rows one at a time:
1sfsqlquery.SqlRowIterator iterator = sfsqlquery.SqlStatement.create('SELECT Id__c FROM accounts__dlm LIMIT 10', 'default')
2 .execute();
3
4if (iterator.hasNext()) {
5 sfsqlquery.Row firstRow = iterator.next();
6 System.debug('First ID: ' + firstRow.getString('Id__c'));
7}