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() невозможно сбросить внутренний курсор элементов данных до первого элемента данных, чтобы начать повторное чтение элементов данных. Элемент данных (здесь документ), который был извлечён один раз с помощью fetchOne(), может быть отброшен подключаемым модулем. Жизненный цикл элемента данных отвязан от набора данных. С точки зрения подключаемого модуля элементы потребляются вызывающим объектом по мере их извлечения. Этот пример предполагает, что схема для тестирования существует.
myColl = db.get_collection('my_collection')
res = myColl.find('name like :name').bind('name','L%').execute()
doc = res.fetch_one()
while doc:
print(doc)
doc = res.fetch_one()
Следующий пример показывает, как напрямую получить доступ к строкам, возвращённым операцией Table.select(). Базовый шаблон кода для итерации по результатам одинаков. Различие между этим и предыдущим примером заключается в обработке элементов данных. Здесь fetchOne() возвращает строки. Точный синтаксис доступа к значениям столбцов строки зависит от языка. Реализации стремятся обеспечить шаблон доступа, специфичный для языка. Пример предполагает, что схема test существует, и что таблица employees существует в myTable.
myRows = myTable.select(['name', 'age']).where('name like :name').bind('name','L%').execute()
row = myRows.fetch_one()
while row:
# Accessing the fields by array
print('Name: %s\n' % row[0])
# Accessing the fields by dynamic attribute
print('Age: %s\n' % row.age)
row = myRows.fetch_one()
© 2025 Oracle
Licensed under the GPLv2 License.