循环中的SOQL查询

时间:2015-08-07 13:07:58

标签: apex soql

以下APEX代码:

for (List<MyObject__c> list : [select id,some_fields from MyObject__c]) {
  for (MyObject__c item : list) {
    //do stuff
  }
}

是处理大量数据的标准模式 - 它会自动将大量结果集分解为200条记录,因此每个List将包含200个对象。

上述方法与以下方法之间是否有任何区别:

for (List<MyObject__c> list : Database.query('select...')) {
  for (MyObject__c item : list) {
    //do stuff
  }
}

在SOQL需要动态时使用?

我被告知第二种方法是丢失数据,但我不确定细节,挑战在于找出原因,并防止数据丢失。

1 个答案:

答案 0 :(得分:0)

您在哪里阅读使用动态SOQL会导致此方案中的数据丢失?这是不真实的AFAIK。静态Database.query()方法的行为与静态SOQL完全相同,除了一些小差异。

要回答您的第一个问题,您的方法之间的主要区别在于第一个是静态的(查询是固定的),第二个允许您动态定义查询,顾名思义。使用Dynamic SOQL的第二种方法仍然可以为您创建结果记录。

这种差异确实导致了一些其他微妙的考虑因素 - 动态SOQL不支持除基本操作之外的变量绑定。请参阅Daniel Ballinger关于此功能的想法here。我还需要添加必要的安全警告 - 如果您使用动态SOQL,不构建基于输入的查询,因为这会使您的应用程序容易受到SOQL注入。

另外,我只是好奇,您的用例/您在这里谈论的数据量是多少?根据您的要求,使用batch Apex可能更好。