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(), может быть отброшен коннектором. Жизненный цикл элемента данных отвязан от набора данных. С точки зрения коннектора, элементы потребляются вызывающей стороной по мере их получения. Этот пример предполагает, что схема теста существует.
JavaScript код MySQL Shell
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);
}
Python код MySQL Shell
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()
Код C#
var myColl = db.GetCollection("my_collection");
var res = myColl.Find("name like :name").Bind("name", "L%")
.Execute();
DbDoc doc;
while ((doc = res.FetchOne()) != null)
{
Console.WriteLine(doc);
}
Код Python
my_coll = db.get_collection('my_collection')
res = my_coll.find('name like :name').bind('name', 'L%').execute()
doc = res.fetch_one()
while doc:
print(doc)
doc = res.fetch_one()
Код Java
Collection myColl = db.getCollection("my_collection");
DocResult res = myColl.find("name like :name").bind("name", "L%")
.execute();
DbDoc doc;
while ((doc = res.fetchOne()) != null) {
System.out.println(doc);
}
Код C++
Collection myColl = db.getCollection("my_collection");
DocResult res = myColl.find("name like :name").bind("name", "L%").execute();
DbDoc doc;
while ((doc = res.fetchOne()))
{
cout << doc <<endl;
}
JavaScript код Node.js
var myColl = db.getCollection('my_collection');
myColl.find('name like :name')
.bind('name', 'L%')
.execute()
.then(res => {
while (doc = res.fetchOne()) {
console.log(doc);
}
});
myColl.find('name like :name')
.bind('name', 'L%')
.execute(function (doc) {
console.log(doc);
});
При использовании Node.js, результаты также могут быть возвращены в функцию обратного вызова, которая передаётся в execute() асинхронно по мере прибытия результатов с сервера.
var myColl = db.getCollection('my_collection');
myColl.find('name like :name')
.bind('name', 'L%')
.execute(function (doc) {
console.log(doc);
});
Следующий пример показывает, как напрямую получить доступ к строкам, возвращаемым операцией Table.select(). Основной шаблон кода для итерации по результатам аналогичен. Разница между этим и предыдущим примером заключается в обработке элементов данных. Здесь, fetchOne() возвращает строки. Точный синтаксис доступа к значениям столбцов строки зависит от языка. Реализации стремятся предоставить родной для языка шаблон доступа. Пример предполагает, что схема test существует и что таблица сотрудников существует в myTable.
JavaScript код MySQL Shell
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');
}
Python код MySQL Shell
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()
JavaScript код Node.js
var myRows = myTable
.select(['name', 'age'])
.where('name like :name')
.bind('name','L%')
.execute(function (row) {
// Connector/Node.js does not support referring to row columns by their name yet.
// One needs to access fields by their array index.
console.log('Name: ' + row[0]);
console.log(' Age: ' + row[1]);
});
В качестве альтернативы можно использовать обратные вызовы:
myTable.select(['name', 'age'])
.where('name like :name')
.bind('name', 'L%')
.execute()
.then(myRows => {
while (var row = myRows.fetchOne()) {
// Accessing the fields by array
console.log('Name: ' + row[0] + '\n');
console.log('Age: ' + row[1] + '\n');
}
});
Код C#
var myRows = myTable.Select("name", "age")
.Where("name like :name").Bind("name", "L%")
.Execute();
Row row;
while ((row = myRows.FetchOne()) != null)
{
// Accessing the fields by array
Console.WriteLine("Name: " + row[0]);
// Accessing the fields by name
Console.WriteLine("Age: " + row["age"]);
}
Код Python
rows = my_table.select(['name', 'age']).where('name like :name').bind('name','L%').execute()
row = rows.fetch_one()
while row:
# Accessing the fields by array
print('Name: {0}'.format(row[0]))
# Accessing the fields by dynamic attribute
print('Age: {0}'.format(row['age'])
row = rows.fetch_one()
Код Java
RowResult myRows = myTable.select("name, age")
.where("name like :name").bind("name", "L%")
.execute();
Row row;
while ((row = myRows.fetchOne()) != null) {
// Accessing the fields
System.out.println(" Age: " + row.getInt("age") + "\n");
}
Код C++
RowResult myRows = myTable.select("name", "age")
.where("name like :name")
.bind("name", "L%")
.execute();
Row row;
while ((row = myRows.fetchOne()))
{
// Connector/C++ does not support referring to row columns by their name yet.
cout <<"Name: " << row[0] <<endl;
cout <<" Age: " << row[1] <<endl;
int age = row[1];
// One needs explicit .get<int>() as otherwise operator<() is ambiguous
bool uforty = row[age].get<int>() < 40;
// Alternative formulation
bool uforty = (int)row[age] < 40;
}
© 2025 Oracle
Licensed under the GPLv2 License.