循环中的 SOQL 查询

SOQL Query in loop

以下 APEX 代码:

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

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

上面的做法和下面的有什么区别吗:

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

当SOQL需要动态时使用?

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

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

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

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

另外,我很好奇,你在这里说的大量数据有什么用case/how?根据您的要求,使用 batch Apex 可能会更好。