9.5 Работа с наборами результатов SQL
При выполнении SQL-операции на сессии с использованием метода sql() возвращается набор результатов. Перебор набора результатов аналогичен работе с результатами операций CRUD. В следующем примере предполагается, что таблица пользователей существует.
var res = mySession.sql('SELECT name, age FROM users').execute();
var row;
while (row = res.fetchOne()) {
print('Name: ' + row['name'] + '\n');
print(' Age: ' + row.age + '\n');
}
Набор результатов отличается от результатов, возвращаемых операциями CRUD, способом представления наборов результатов и наборов данных. Объект набора результатов объединяет набор результатов, полученный, например, с помощью , и набор данных, полученный, например, с помощью в один. В отличие от операций CRUD, для наборов результатов нет различия между двумя типами для SqlResult. Объект набора результатов экспортирует методы для доступа к данным и получения последнего вставленного ID или количества затронутых строк.
Используйте метод hasData(), чтобы узнать, является ли набор результатов набором данных или результатом. Этот метод полезен, когда код не знает происхождения набора результатов. Это может быть случай при написании универсальной функции приложения для вывода результатов запросов или при обработке результатов хранимых процедур. Если hasData() возвращает true, то набор результатов происходит из запроса или подобной команды, которая может вернуть строки.
Возвращаемое значение true не указывает, содержит ли набор данных какие-либо строки. Набор данных может быть пустым, если, например, fetchOne() возвращает NULL или fetchAll() возвращает пустой список. И если возвращается несколько наборов результатов, любой из наборов результатов может быть пустым. В следующем примере предполагается, что процедура my_proc существует.
var res = mySession.sql('CALL my_proc()').execute();
if (res.hasData()){
var row = res.fetchOne();
if (row){
print('List of rows available for fetching.');
do {
print(row);
} while (row = res.fetchOne());
}
else{
print('Empty list of rows.');
}
}
else {
print('No row result.');
}
Ошибка возникает при вызове fetchOne() или fetchAll(), когда hasData() указывает, что набор результатов не является набором данных.
function print_result(res) {
if (res.hasData()) {
// SELECT
var columns = res.getColumns();
var record = res.fetchOne();
while (record){
for (index in columns){
print (columns[index].getColumnName() + ": " + record[index] + "\n");
}
// Get the next record
record = res.fetchOne();
}
} else {
// INSERT, UPDATE, DELETE, ...
print('Rows affected: ' + res.getAffectedItemsCount());
}
}
print_result(mySession.sql('DELETE FROM users WHERE age < 30').execute());
print_result(mySession.sql('SELECT * FROM users WHERE age = 40').execute());
Вызов хранимой процедуры может привести к необходимости обработки нескольких наборов результатов в рамках одного выполнения. В результате выполнения запроса возвращается объект SqlResult, который инкапсулирует первый набор результатов. После обработки набора результатов можно вызвать nextResult(), чтобы перейти к следующему набору, если он есть. После перехода к следующему набору результатов он заменяет ранее загруженный результат, который становится недоступным.
function print_result(res) {
if (res.hasData()) {
// SELECT
var columns = res.getColumns();
var record = res.fetchOne();
while (record){
for (index in columns){
print (columns[index].getColumnName() + ": " + record[index] + "\n");
}
// Get the next record
record = res.fetchOne();
}
} else {
// INSERT, UPDATE, DELETE, ...
print('Rows affected: ' + res.getAffectedItemsCount());
}
}
var res = mySession.sql('CALL my_proc()').execute();
// Prints each returned result
var more = true;
while (more){
print_result(res);
more = res.nextResult();
}
Количество наборов результатов неизвестно сразу после выполнения запроса. Результаты запроса могут передаваться клиенту потоком или буферироваться на клиенте. В режиме потоковой передачи или частичного буферирования клиент не может определить, отправляет ли запрос более одного набора результатов.
© 2025 Oracle
Licensed under the GPLv2 License.