Spec-Zone.ru › MySQL Connectors 1.0

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.
https://docs.oracle.com/cd/E17952_01/x-devapi-userguide-en/working-with-data-sets.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API