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:
sfsqlquery.SqlRowIterator iterator = sfsqlquery.SqlStatement.create('SELECT Id__c, Name__c FROM accounts__dlm LIMIT 100', 'default') .execute(); for (sfsqlquery.Row row : iterator) { System.debug(row.getString('Id__c') + ': ' + row.getString('Name__c')); }
Resume from a previously saved query ID:
sfsqlquery.QueryHandle handle = sfsqlquery.QueryHandle.create('my-query-id-123', 'default') .withOffset(500); // Skip first 500 rows already processed sfsqlquery.SqlRowIterator iterator = new sfsqlquery.SqlRowIterator(handle); while (iterator.hasNext()) { sfsqlquery.Row row = iterator.next(); System.debug(row.getString('Name__c')); }
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:
sfsqlquery.SqlRowIterator iterator = sfsqlquery.SqlStatement.create('SELECT Id__c, Amount__c FROM accounts__dlm', 'default') .execute(); Decimal totalAmount = 0; for (sfsqlquery.Row row : iterator) { Decimal amount = row.getDecimal('Amount__c'); if (amount != null) { totalAmount += amount; if (totalAmount > 1000000) { iterator.cancel(); // Stop when threshold is reached break; } } }
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:
sfsqlquery.SqlRowIterator iterator = sfsqlquery.SqlStatement.create('SELECT * FROM accounts__dlm LIMIT 10', 'default') .execute(); List<String> columns = iterator.getColumnNames(); List<ConnectApi.QuerySqlMetadataItem> metadata = iterator.getMetadata(); System.debug('Query returned ' + columns.size() + ' columns'); for (Integer i = 0; i < metadata.size(); i++) { System.debug(columns[i] + ' (' + metadata[i].type + ')'); } // Process rows using the metadata for (sfsqlquery.Row row : iterator) { for (String columnName : columns) { Object value = row.getObject(columnName); System.debug(columnName + ': ' + value); } }
getQueryId()
Signature
public String getQueryId()
Example
Save query ID for resuming later:
sfsqlquery.SqlRowIterator iterator = sfsqlquery.SqlStatement.create('SELECT Id__c FROM accounts__dlm', 'default') .execute(); String queryId = iterator.getQueryId(); // Store queryId to resume in a later transaction
hasNext()
Signature
public Boolean hasNext()
Example
Use in a while loop:
sfsqlquery.SqlRowIterator iterator = sfsqlquery.SqlStatement.create('SELECT Name__c FROM accounts__dlm', 'default') .execute(); while (iterator.hasNext()) { sfsqlquery.Row row = iterator.next(); System.debug(row.getString('Name__c')); }
iterator()
Signature
public Iterator iterator()
next()
Signature
public sfsqlquery.Row next()
Example
Process rows one at a time:
sfsqlquery.SqlRowIterator iterator = sfsqlquery.SqlStatement.create('SELECT Id__c FROM accounts__dlm LIMIT 10', 'default') .execute(); if (iterator.hasNext()) { sfsqlquery.Row firstRow = iterator.next(); System.debug('First ID: ' + firstRow.getString('Id__c')); }