Поделиться через


Несколько результатов

Результатом является то, что возвращается источником данных после выполнения инструкции. ODBC имеет два типа результатов: результирующие наборы и счетчики строк. Количество строк — это количество строк, затронутых инструкцией обновления, удаления или вставки. Пакеты, описанные в пакетах инструкций SQL, могут создавать несколько результатов.

В следующей таблице перечислены параметры SQLGetInfo , которые приложение использует для определения того, возвращает ли источник данных несколько результатов для каждого типа пакета. В частности, источник данных может возвращать одно число строк для всего пакета инструкций или отдельных счетчиков строк для каждой инструкции в пакете. В случае инструкции создания результирующих наборов, выполняемой с массивом параметров, источник данных может возвращать один результирующий набор для всех наборов параметров или отдельных результирующих наборов для каждого набора параметров.

Тип пакетного процесса Количество строк Результирующие наборы
Явный пакет SQL_BATCH_ROW_COUNT[a] --[b]
Procedure SQL_BATCH_ROW_COUNT[a] --[b]
Массивы параметров SQL_PARAM_ARRAYS_ROW_COUNTS SQL_PARAM_ARRAYS_SELECTS

Операции по подсчету строк в пакете могут поддерживаться, но возврат числа строк не поддерживается. Параметр SQL_BATCH_SUPPORT в SQLGetInfo указывает, разрешены ли инструкции подсчета строк в пакетах; Параметр SQL_BATCH_ROW_COUNTS указывает, возвращаются ли эти счетчики строк приложению.

[b] Явные пакеты и процедуры всегда возвращают несколько наборов результатов, если они включают несколько инструкций, генерирующих наборы результатов.

Замечание

Параметр SQL_MULT_RESULT_SETS, представленный в ODBC 1.0, предоставляет только общие сведения о том, можно ли возвращать несколько результирующих наборов. В частности, оно имеет значение "Y", если SQL_BS_SELECT_EXPLICIT или SQL_BS_SELECT_PROC биты возвращаются для SQL_BATCH_SUPPORT или если SQL_PAS_BATCH возвращается для SQL_PARAM_ARRAYS_SELECT.

Для обработки нескольких результатов приложение вызывает SQLMoreResults. Эта функция удаляет текущий результат и делает следующий результат доступным. Он возвращает SQL_NO_DATA, если нет дополнительных результатов. Например, предположим, что следующие высказывания выполняются в пакетном режиме:

SELECT * FROM Parts WHERE Price > 100.00;  
UPDATE Parts SET Price = 0.9 * Price WHERE Price > 100.00  

После выполнения этих инструкций приложение извлекает строки из результированного набора, созданного инструкцией SELECT . Когда завершится получение строк, он вызывает SQLMoreResults, чтобы сделать доступным количество частей, которые были переценены. При необходимости SQLMoreResults удаляет неполученные строки и закрывает курсор. Затем приложение вызывает SQLRowCount, чтобы определить, сколько частей было перепрайсено оператором UPDATE.

Это зависит от драйвера, выполняется ли всё пакетное выражение до того, как будут доступны результаты. В некоторых реализациях это так; в других вызов SQLMoreResults активирует выполнение следующего оператора в пакете.

Если одна из инструкций в пакете завершается сбоем, SQLMoreResults возвращает SQL_ERROR или SQL_SUCCESS_WITH_INFO. Если пакет был прерван при сбое инструкции или не удалось выполнить последнюю инструкцию в пакете, SQLMoreResults вернет SQL_ERROR. Если пакет не был прерван при сбое инструкции и сбойная инструкция не является последней в пакете, SQLMoreResults вернет SQL_SUCCESS_WITH_INFO. SQL_SUCCESS_WITH_INFO указывает, что был создан хотя бы один результирующий набор или число, и что пакет не был прерван.