Varios resultados
Un resultado es lo que devuelve el origen de datos después de ejecutar una instrucción. ODBC tiene dos tipos de resultados: conjuntos de resultados y recuentos de filas. Los recuentos de filas son el número de filas afectado por una instrucción de actualización, eliminación o inserción. Los lotes, descritos en Lotes de instrucciones SQL, pueden generar varios resultados.
En la tabla siguiente se enumeran las opciones de SQLGetInfo que usa una aplicación para determinar si un origen de datos devuelve varios resultados para cada tipo de lote diferente. En concreto, un origen de datos puede devolver un recuento de filas único para todo el lote de instrucciones o recuentos de filas individuales para cada instrucción del lote. En el caso de una instrucción de generación de conjuntos de resultados ejecutada con una matriz de parámetros, el origen de datos puede devolver un único conjunto de resultados para todos los conjuntos de parámetros o conjuntos de resultados individuales para cada conjunto de parámetros.
Tipo de lote | Recuentos de filas | Conjuntos de resultados |
---|---|---|
Lote explícito | SQL_BATCH_ROW_COUNT[a] | --[b] |
Procedimiento | SQL_BATCH_ROW_COUNT[a] | --[b] |
Matrices de parámetros | SQL_PARAM_ARRAYS_ROW_COUNTS | SQL_PARAM_ARRAYS_SELECTS |
[a] Se pueden admitir instrucciones de generación de recuentos de filas en un lote, pero no se admite la devolución de los recuentos de filas. La opción SQL_BATCH_SUPPORT de SQLGetInfo indica si se permiten instrucciones de generación de recuentos de filas en los lotes; la opción SQL_BATCH_ROW_COUNTS indica si estos recuentos de filas se devuelven a la aplicación.
[b] Los lotes y procedimientos explícitos siempre devuelven varios conjuntos de resultados cuando incluyen varias instrucciones de generación de conjuntos de resultados.
Nota:
La opción SQL_MULT_RESULT_SETS introducida en ODBC 1.0 solo proporciona información general sobre si se pueden devolver varios conjuntos de resultados. En concreto, se establece en "Y" si se devuelven los bits SQL_BS_SELECT_EXPLICIT o SQL_BS_SELECT_PROC para SQL_BATCH_SUPPORT o si se devuelve SQL_PAS_BATCH para SQL_PARAM_ARRAYS_SELECT.
Para procesar varios resultados, una aplicación llama a SQLMoreResults. Esta función descarta el resultado actual y hace que el siguiente resultado esté disponible. Devuelve SQL_NO_DATA cuando no hay más resultados disponibles. Por ejemplo, supongamos que las siguientes instrucciones se ejecutan como un lote:
SELECT * FROM Parts WHERE Price > 100.00;
UPDATE Parts SET Price = 0.9 * Price WHERE Price > 100.00
Una vez ejecutadas estas instrucciones, la aplicación captura las filas del conjunto de resultados creado por la instrucción SELECT. Una vez finalizada la captura de filas, llama a SQLMoreResults para que esté disponible el número de partes cuyo precio ha cambiado. Si es necesario, SQLMoreResults descarta las filas no capturadas y cierra el cursor. A continuación, la aplicación llama a SQLRowCount para determinar en cuántas partes cambió el precio mediante la instrucción UPDATE.
Es específico del controlador si se ejecuta toda la instrucción por lotes antes de que haya resultados disponibles. En algunas implementaciones, esto es lo que sucede; en otros, la llamada a SQLMoreResults desencadena la ejecución de la siguiente instrucción en el lote.
Si se produce un error en una de las instrucciones de un lote, SQLMoreResults devolverá SQL_ERROR o SQL_SUCCESS_WITH_INFO. Si el lote se anuló cuando se produjo un error en la instrucción o la instrucción con error era la última instrucción del lote, SQLMoreResults devolverá SQL_ERROR. Si el lote no se anuló cuando se produjo un error en la instrucción y la instrucción con error era la última instrucción del lote, SQLMoreResults devolverá SQL_SUCCESS_WITH_INFO. SQL_SUCCESS_WITH_INFO indica que se generó al menos un conjunto de resultados o un recuento y que el lote no se anuló.