获取数据项的操作会返回一个游标,该游标可用于从结果集中使用这些数据项。可以使用 Collection.find()
、Table.select()
和 Session.sql()
从数据库读取数据项。Collection.find()
返回包含文档的数据集,而 Table.select()
和 Session.sql()
则返回包含行的结果集。
所有结果集都实现了一种统一的方式来迭代其数据项。统一的语法支持使用 fetchOne()
一次获取一项,或使用 fetchAll()
检索所有项的列表。fetchOne()
和 fetchAll()
遵循仅向前迭代语义。实现 X DevAPI 的连接器可以在之上提供更高级的迭代模式,以匹配常见的本地语言模式。
以下示例显示如何通过使用 fetchOne()
循环遍历所有文档来访问 Collection.find()
操作返回的文档。
对 fetchOne()
的第一次调用返回找到的第一个文档。所有后续调用都会将内部数据项迭代器游标递增一个位置,并返回找到的项,从而使对 fetchOne()
的第二次调用返回找到的第二个文档(如果有)。读取最后一个数据项并再次调用 fetchOne()
时,将返回 NULL
值。这确保了所示的基本 while 循环适用于所有支持此类实现的语言。
使用 fetchOne()
时,无法将内部数据项游标重置为第一个数据项以重新开始读取数据项。连接器可以丢弃已使用 fetchOne()
获取过一次的数据项(此处为文档)。数据项的生命周期与数据集分离。从连接器的角度来看,项目在获取时由调用者使用。此示例假设测试模式存在。
var myColl = db.getCollection('my_collection');
var res = myColl.find('name like :name').bind('name','L%').
execute();
var doc;
while (doc = res.fetchOne()) {
print(doc);
}
以下示例显示如何直接访问 Table.select()
操作返回的行。结果迭代的基本代码模式是相同的。以下示例与上一个示例之间的区别在于数据项处理。此处,fetchOne()
返回行。访问行的列值的精确语法取决于语言。实现旨在提供语言原生的访问模式。该示例假设 test
模式存在,并且 employee 表存在于 myTable
中。
var myRows = myTable.select(['name', 'age']).
where('name like :name').bind('name','L%').
execute();
var row;
while (row = myRows.fetchOne()) {
// Accessing the fields by array
print('Name: ' + row['name'] + '\n');
// Accessing the fields by dynamic attribute
print(' Age: ' + row.age + '\n');
}