Note: This release is in preview. Features described here don’t become generally available until the latest general availability date that Salesforce announces for this release. Before then, and where features are noted as beta, pilot, or developer preview, we can’t guarantee general availability within any particular time frame or at all. Make your purchase decisions only on the basis of generally available products and features.
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}