9.3 Работа с наборами данных
Операции, извлекающие элементы данных, возвращают курсор, который может быть использован для потребления этих элементов данных из набора результатов. Элементы данных можно читать из базы данных, используя Collection.find(), Table.select() и Session.sql(). Collection.find() возвращает набор данных с документами, а Table.select() соответственно Session.sql() возвращают набор данных со строками.
Все наборы результатов реализуют единый способ итерации по их элементам данных. Объединённый синтаксис поддерживает извлечение элементов по одному с помощью fetchOne() или получение списка всех элементов с помощью fetchAll(). fetchOne() и fetchAll() следуют семантике итерации только вперёд. Подключаемые модули, реализующие X DevAPI, могут предложить более продвинутые схемы итерации, чтобы соответствовать общим схемам в родных языках программирования.
Следующий пример демонстрирует, как получить доступ к документам, возвращаемым операцией Collection.find(), используя fetchOne() для цикла по всем документам.
Первый вызов fetchOne() возвращает первый найденный документ. Все последующие вызовы увеличивают внутренний курсор итератора элементов данных на одну позицию и возвращают найденный элемент, в результате чего второй вызов fetchOne() возвращает второй найденный документ, если таковой есть. Когда последний элемент данных был прочитан, а fetchOne() вызывается снова, возвращается значение NULL. Это гарантирует, что базовый цикл while работает со всеми языками, которые поддерживают такую реализацию.
При использовании fetchOne() невозможно сбросить внутренний курсор элементов данных до первого элемента данных, чтобы начать повторное чтение элементов данных. Элемент данных (здесь Document), который был извлечён один раз с помощью 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 существует, и что таблица employees существует в 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');
}
© 2025 Oracle
Licensed under the GPLv2 License.