Función SQLExecute
Conformidad
Versión introducida: Cumplimiento de estándares ODBC 1.0: ISO 92
Resumen
SQLExecute ejecuta una instrucción preparada con los valores actuales de las variables de marcador de parámetros si existen marcadores de parámetros en la instrucción .
Sintaxis
SQLRETURN SQLExecute(
SQLHSTMT StatementHandle);
Argumentos
StatementHandle
[Entrada] Identificador de instrucciones.
Devoluciones
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NEED_DATA, SQL_STILL_EXECUTING, SQL_ERROR, SQL_NO_DATA, SQL_INVALID_HANDLE o SQL_PARAM_DATA_AVAILABLE.
Diagnóstico
Cuando SQLExecute devuelve SQL_ERROR o SQL_SUCCESS_WITH_INFO, se puede obtener un valor SQLSTATE asociado llamando a SQLGetDiagRec con un HandleType de SQL_HANDLE_STMT y un identificador de StatementHandle. En la tabla siguiente se enumeran los valores SQLSTATE devueltos normalmente por SQLExecute y se explica cada uno en el contexto de esta función; la notación "(DM)" precede a las descripciones de SQLSTATEs devueltas por el Administrador de controladores. El código de retorno asociado a cada valor SQLSTATE es SQL_ERROR, a menos que se indique lo contrario.
SQLSTATE | Error | Descripción |
---|---|---|
01000 | Advertencia general | Mensaje informativo específico del controlador. (Function devuelve SQL_SUCCESS_WITH_INFO). |
01001 | Conflicto de la operación del cursor | La instrucción preparada asociada a StatementHandle contenía una instrucción de actualización o eliminación posicionada, y ninguna fila o más de una fila se actualizaron o eliminaron. (Para obtener más información sobre las actualizaciones de más de una fila, consulte la descripción de la SQL_ATTR_SIMULATE_CURSOR Atributo en SQLSetStmtAttr). (Function devuelve SQL_SUCCESS_WITH_INFO). |
01003 | Valor NULL eliminado en la función set | La instrucción preparada asociada a StatementHandle contenía una función set (como AVG, MAX, MIN, etc.), pero no la función count set y los valores de argumento NULL se eliminaron antes de aplicar la función. (Function devuelve SQL_SUCCESS_WITH_INFO). |
01004 | Datos de cadena, truncados a la derecha | Los datos binarios o de cadena devueltos para un parámetro de salida provocaron el truncamiento de datos binarios que no son null o caracteres no NULL. Si era un valor de cadena, se truncaba a la derecha. (Function devuelve SQL_SUCCESS_WITH_INFO). |
01006 | Privilegio no revocado | La instrucción preparada asociada a StatementHandle era una instrucción REVOKE y el usuario no tenía el privilegio especificado. (Function devuelve SQL_SUCCESS_WITH_INFO). |
01007 | Privilegio no concedido | La instrucción preparada asociada a StatementHandle era una instrucción GRANT y el usuario no podía conceder el privilegio especificado. |
01S02 | Valor de opción cambiado | Un atributo de instrucción especificado no era válido debido a las condiciones de trabajo de implementación, por lo que se sustituyó temporalmente un valor similar. (Se puede llamar a SQLGetStmtAttr para determinar cuál es el valor sustituido temporalmente). El valor sustituto es válido para StatementHandle hasta que se cierra el cursor, en cuyo punto el atributo de instrucción vuelve a su valor anterior. Los atributos de instrucción que se pueden cambiar son: SQL_ATTR_CONCURRENCY, SQL_ATTR_CURSOR_TYPE, SQL_ATTR_KEYSET_SIZE, SQL_ATTR_MAX_LENGTH, SQL_ATTR_MAX_ROWS, SQL_ATTR_QUERY_TIMEOUT y SQL_ATTR_SIMULATE_CURSOR. (Function devuelve SQL_SUCCESS_WITH_INFO). |
01S07 | Truncamiento fraccionario | Los datos devueltos para un parámetro de entrada/salida o salida se truncaron de modo que la parte fraccionaria de un tipo de datos numérico se truncaba o la parte fraccionaria del componente de tiempo de un tipo de datos time, timestamp o interval se truncaba. (Function devuelve SQL_SUCCESS_WITH_INFO). |
07002 | Campo COUNT incorrecto | El número de parámetros especificados en SQLBindParameter era menor que el número de parámetros de la instrucción SQL contenida en *StatementText. Se llamó a SQLBindParameter con ParameterValuePtr establecido en un puntero nulo, StrLen_or_IndPtr no establecido en SQL_NULL_DATA o SQL_DATA_AT_EXEC, y InputOutputType no se estableció en SQL_PARAM_OUTPUT, por lo que el número de parámetros especificados en SQLBindParameter era mayor que el número de parámetros de la instrucción SQL contenida en *StatementText. |
07006 | Infracción de atributo de tipo de datos restringido | No se pudo convertir el valor de datos identificado por el argumento ValueType en SQLBindParameter para el parámetro enlazado al tipo de datos identificado por el argumento ParameterType en SQLBindParameter. No se pudo convertir el valor de datos devuelto para un parámetro enlazado como SQL_PARAM_INPUT_OUTPUT o SQL_PARAM_OUTPUT al tipo de datos identificado por el argumento ValueType en SQLBindParameter. (Si los valores de datos de una o varias filas no se pudieron convertir, pero se devolvieron correctamente una o varias filas, esta función devuelve SQL_SUCCESS_WITH_INFO). |
07007 | Infracción del valor del parámetro restringido | El tipo de parámetro SQL_PARAM_INPUT_OUTPUT_STREAM solo se usa para un parámetro que envía y recibe datos en partes. No se permite un búfer enlazado a entrada para este tipo de parámetro. Este error se producirá cuando se SQL_PARAM_INPUT_OUTPUT el tipo de parámetro y cuando el *StrLen_or_IndPtr especificado en SQLBindParameter no es igual a SQL_NULL_DATA, SQL_DEFAULT_PARAM, SQL_LEN_DATA_AT_EXEC(len) o SQL_DATA_AT_EXEC. |
07S01 | Uso no válido del parámetro predeterminado | Se SQL_DEFAULT_PARAM un valor de parámetro establecido con SQLBindParameter y el parámetro correspondiente no era un parámetro para una invocación de procedimiento canónico ODBC. |
08S01 | Error de vínculo de comunicación | Se produjo un error en el vínculo de comunicación entre el controlador y el origen de datos al que se conectó el controlador antes de que la función completara el procesamiento. |
21S02 | El grado de tabla derivada no coincide con la lista de columnas | La instrucción preparada asociada a StatementHandle contenía una instrucción CREATE VIEW y la lista de columnas no calificadas (el número de columnas especificadas para la vista en los argumentos de identificador de columna de la instrucción SQL) contenía más nombres que el número de columnas de la tabla derivada definida por el argumento query-specification de la instrucción SQL. |
22001 | Datos de cadena, truncamiento derecho | La asignación de un carácter o valor binario a una columna dio como resultado el truncamiento de caracteres o bytes no nulos (binarios). |
22002 | Variable de indicador necesaria pero no proporcionada | Los datos NULL se enlazaban a un parámetro de salida cuyo StrLen_or_IndPtr establecido por SQLBindParameter era un puntero nulo. |
22003 | Valor numérico fuera del intervalo | La instrucción preparada asociada con StatementHandle contenía un parámetro numérico enlazado y el valor del parámetro provocaba que toda la parte (en lugar de fraccionaria) del número se truncase cuando se asignase a la columna de tabla asociada. Devolver un valor numérico (como numérico o cadena) para uno o varios parámetros de entrada/salida o salida habrían provocado que toda la parte (en lugar de fraccionaria) del número se truncase. |
22007 | Formato datetime no válido | La instrucción preparada asociada a StatementHandle contenía una instrucción SQL que contenía una estructura de fecha, hora o marca de tiempo como parámetro enlazado, y el parámetro era, respectivamente, una fecha, hora o marca de tiempo no válidas. Un parámetro de entrada/salida o salida estaba enlazado a una estructura C de fecha, hora o marca de tiempo, y un valor en el parámetro devuelto era, respectivamente, una fecha, hora o marca de tiempo no válidas. (Function devuelve SQL_SUCCESS_WITH_INFO). |
22008 | Desbordamiento de campo datetime | La instrucción preparada asociada a StatementHandle contenía una instrucción SQL que contenía una expresión datetime que, cuando se calculaba, producía una estructura de fecha, hora o marca de tiempo que no era válida. Una expresión datetime calculada para un parámetro de entrada/salida o salida dio lugar a una estructura C de fecha, hora o marca de tiempo que no era válida. |
22012 | División por cero | La instrucción preparada asociada a StatementHandle contenía una expresión aritmética que provocaba la división por cero. Una expresión aritmética calculada para un parámetro de entrada/salida o salida dio como resultado la división en cero. |
22015 | Desbordamiento de campo de intervalo | *StatementText contenía un parámetro numérico o de intervalo exacto que, cuando se convierte en un tipo de datos SQL de intervalo, provocó una pérdida de dígitos significativos. *StatementText contenía un parámetro de intervalo con más de un campo que, cuando se convierte en un tipo de datos numérico en una columna, no tenía ninguna representación en el tipo de datos numérico. *StatementText contenía datos de parámetro que se asignaron a un tipo SQL de intervalo y no había ninguna representación del valor del tipo C en el tipo SQL interval. La asignación de un parámetro de entrada/salida o salida que era un tipo SQL numérico o de intervalo exacto a un tipo de intervalo C provocó una pérdida de dígitos significativos. Cuando se asignó un parámetro de entrada/salida o salida a una estructura de intervalo C, no había ninguna representación de los datos en la estructura de datos de intervalo. |
22018 | Valor de carácter no válido para la especificación de conversión | *StatementText contenía un tipo de C que era un numérico exacto o aproximado, un tipo de datos datetime o un tipo de datos interval; el tipo SQL de la columna era un tipo de datos de caracteres; y el valor de la columna no era un literal válido del tipo C enlazado. Cuando se devolvió un parámetro de entrada/salida o salida, el tipo SQL era un numérico exacto o aproximado, una fecha y hora o un tipo de datos interval; el tipo C se SQL_C_CHAR; y el valor de la columna no era un literal válido del tipo SQL enlazado. |
22019 | Carácter de escape no válido | La instrucción preparada asociada a StatementHandle contenía un predicado LIKE con un ESCAPE en la cláusula WHERE y la longitud del carácter de escape que sigue a ESCAPE no era igual a 1. |
22025 | Secuencia de escape no válida | La instrucción preparada asociada a StatementHandle contenía "LIKE pattern value ESCAPE escape character" en la cláusula WHERE y el carácter que sigue al carácter de escape en el valor de patrón no era uno de "%" o "_". |
23000 | Infracción de restricción de integridad | La instrucción preparada asociada con StatementHandle contenía un parámetro . El valor del parámetro era NULL para una columna definida como NOT NULL en la columna de tabla asociada, se proporcionó un valor duplicado para que una columna restringida contenga solo valores únicos o se infringió alguna otra restricción de integridad. |
24000 | Estado de cursor no válido | Un cursor se colocó en statementHandle por SQLFetch o SQLFetchScroll. El Administrador de controladores devuelve este error si SQLFetch o SQLFetchScroll no ha devuelto SQL_NO_DATA y el controlador devuelve si SQLFetch o SQLFetchScroll ha devuelto SQL_NO_DATA. Se abrió un cursor en StatementHandle. La instrucción preparada asociada a StatementHandle contenía una instrucción de actualización o eliminación posicionada, y el cursor se colocaba antes del inicio del conjunto de resultados o después del final del conjunto de resultados. |
40001 | Error de serialización | La transacción se revierte debido a un interbloqueo de recursos con otra transacción. |
40003 | Finalización de instrucciones desconocida | Error en la conexión asociada durante la ejecución de esta función y no se puede determinar el estado de la transacción. |
42000 | Error de sintaxis o infracción de acceso | El usuario no tenía permiso para ejecutar la instrucción preparada asociada a StatementHandle. |
44 000 | Infracción de WITH CHECK OPTION | La instrucción preparada asociada a StatementHandle contenía una instrucción INSERT realizada en una tabla vista o una tabla derivada de la tabla vista que se creó especificando WITH CHECK OPTION, de modo que una o varias filas afectadas por la instrucción INSERT ya no estarán presentes en la tabla vista. La instrucción preparada asociada a StatementHandle contenía una instrucción UPDATE realizada en una tabla vista o una tabla derivada de la tabla vista que se creó especificando WITH CHECK OPTION, de modo que una o varias filas afectadas por la instrucción UPDATE ya no estarán presentes en la tabla vista. |
HY000 | Error general | Se produjo un error para el que no había ningún SQLSTATE específico y para el que no se definió SQLSTATE específico de la implementación. El mensaje de error devuelto por SQLGetDiagRec en el búfer *MessageText describe el error y su causa. |
HY001 | Error de asignación de memoria | El controlador no pudo asignar memoria necesaria para admitir la ejecución o finalización de la función. |
HY008 | Operación cancelada | El procesamiento asincrónico se ha habilitado para StatementHandle. Se llamó a la función y antes de completar la ejecución, se llamó a SQLCancel o SQLCancelHandle en StatementHandle. A continuación, se llamó a la función de nuevo en StatementHandle. Se llamó a la función y antes de completar la ejecución, se llamó a SQLCancel o SQLCancelHandle en statementHandle desde un subproceso diferente en una aplicación multiproceso. |
HY010 | Error de secuencia de funciones | (DM) Se llamó a una función de ejecución asincrónica para el identificador de conexión asociado a StatementHandle. Esta función asincrónica todavía se estaba ejecutando cuando se llamó a la función SQLExecute . (DM) SQLExecute, SQLExecDirect o SQLMoreResults se llamó a para statementHandle y devolvió SQL_PARAM_DATA_AVAILABLE. Se llamó a esta función antes de recuperar los datos para todos los parámetros transmitidos. (DM) Se llamó a una función que ejecuta de forma asincrónica (no esta) para statementHandle y todavía se estaba ejecutando cuando se llamó a esta función. (DM) SE llamó a SQLExecute, SQLExecDirect, SQLBulkOperations o SQLSetPos para el statementHandle y devolvió SQL_NEED_DATA. Se llamó a esta función antes de enviar datos para todos los parámetros o columnas de datos en ejecución. (DM) La instrucciónHandle no estaba preparada. |
HY013 | Error de administración de memoria | No se pudo procesar la llamada de función porque no se pudo tener acceso a los objetos de memoria subyacentes, posiblemente debido a condiciones de memoria baja. |
HY090 | Longitud de búfer o cadena no válida | Un valor de parámetro, establecido con SQLBindParameter, era un puntero nulo y el valor de longitud del parámetro no era 0, SQL_NULL_DATA, SQL_DATA_AT_EXEC, SQL_DEFAULT_PARAM o menor o igual que SQL_LEN_DATA_AT_EXEC_OFFSET. Un valor de parámetro, establecido con SQLBindParameter, no era un puntero nulo; el tipo de datos de C se SQL_C_BINARY o SQL_C_CHAR; y el valor de longitud del parámetro era menor que 0 pero no era SQL_NTS, SQL_NULL_DATA, SQL_DEFAULT_PARAM o SQL_DATA_AT_EXEC, o menor o igual que SQL_LEN_DATA_AT_EXEC_OFFSET. Un valor de longitud de parámetro enlazado por SQLBindParameter se estableció en SQL_DATA_AT_EXEC; el tipo SQL era SQL_LONGVARCHAR, SQL_LONGVARBINARY o un tipo de datos largo específico del origen de datos; y el tipo de información SQL_NEED_LONG_DATA_LEN en SQLGetInfo era "Y". |
HY105 | Tipo de parámetro no válido | El valor especificado para el argumento InputOutputType en SQLBindParameter se SQL_PARAM_OUTPUT y el parámetro era un parámetro de entrada. |
HY109 | Posición del cursor no válida | La instrucción preparada era una instrucción de actualización o eliminación posicionada y el cursor estaba colocado (por SQLSetPos o SQLFetchScroll) en una fila que se había eliminado o no se pudo capturar. |
HY117 | La conexión se suspende debido al estado de transacción desconocido. Solo se permiten las funciones de desconexión y solo lectura. | (DM) Para obtener más información sobre el estado suspendido, vea Función SQLEndTran. |
HYC00 | Característica opcional no implementada | La combinación de la configuración actual de la SQL_ATTR_CONCURRENCY y los atributos de instrucción SQL_ATTR_CURSOR_TYPE no se admiten en el controlador o el origen de datos. El atributo de instrucción SQL_ATTR_USE_BOOKMARKS se estableció en SQL_UB_VARIABLE y el atributo de instrucción SQL_ATTR_CURSOR_TYPE se estableció en un tipo de cursor para el que el controlador no admite marcadores. |
HYT00 | Se ha agotado el tiempo de espera | El período de tiempo de espera de la consulta expiró antes de que el origen de datos devolva el conjunto de resultados. El período de tiempo de espera se establece mediante SQLSetStmtAttr, SQL_ATTR_QUERY_TIMEOUT. |
HYT01 | Se ha agotado el tiempo de espera de la conexión. | El período de tiempo de espera de conexión expiró antes de que el origen de datos respondiera a la solicitud. El período de tiempo de espera de conexión se establece a través de SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT. |
IM001 | El controlador no admite esta función | (DM) El controlador asociado a StatementHandle no admite la función . |
IM017 | El sondeo está deshabilitado en modo de notificación asincrónica | Cada vez que se usa el modelo de notificación, el sondeo está deshabilitado. |
IM018 | No se ha llamado a SQLCompleteAsync para completar la operación asincrónica anterior en este identificador. | Si la llamada de función anterior en el identificador devuelve SQL_STILL_EXECUTING y si el modo de notificación está habilitado, se debe llamar a SQLCompleteAsync en el identificador para realizar el procesamiento posterior y completar la operación. |
SQLExecute puede devolver cualquier SQLSTATE que SQLPrepare pueda devolver, en función de cuándo el origen de datos evalúe la instrucción SQL asociada a la instrucción .
Comentarios
SQLExecute ejecuta una instrucción preparada por SQLPrepare. Después de que la aplicación procese o descarte los resultados de una llamada a SQLExecute, la aplicación puede llamar a SQLExecute de nuevo con nuevos valores de parámetro. Para obtener más información sobre la ejecución preparada, consulte Ejecución preparada.
Para ejecutar una instrucción SELECT más de una vez, la aplicación debe llamar a SQLCloseCursor antes de volver a ejecutar la instrucción SELECT.
Si el origen de datos está en modo de confirmación manual (que requiere inicio explícito de transacciones) y aún no se ha iniciado una transacción, el controlador inicia una transacción antes de enviar la instrucción SQL. Para más información, consulte Transacciones.
Si una aplicación usa SQLPrepare para preparar y SQLExecute para enviar una instrucción COMMIT o ROLLBACK , no será interoperable entre productos DBMS. Para confirmar o revertir una transacción, llame a SQLEndTran.
Si SQLExecute encuentra un parámetro data-at-execution, devuelve SQL_NEED_DATA. La aplicación envía los datos mediante SQLParamData y SQLPutData. Consulte SQLBindParameter, SQLParamData, SQLPutData y Envío de datos largos.
Si SQLExecute ejecuta una instrucción de actualización, inserción o eliminación buscada que no afecta a ninguna fila en el origen de datos, la llamada a SQLExecute devuelve SQL_NO_DATA.
Si el valor del atributo de instrucción SQL_ATTR_PARAMSET_SIZE es mayor que 1 y la instrucción SQL contiene al menos un marcador de parámetro, SQLExecute ejecuta la instrucción SQL una vez para cada conjunto de valores de parámetro en las matrices a las que apunta el argumento *ParameterValuePtr en las llamadas a SQLBindParameter. Para obtener más información, vea Matrices de valores de parámetros.
Si los marcadores están habilitados y se ejecuta una consulta que no admite marcadores, el controlador debe intentar convertir el entorno en uno que admita marcadores cambiando un valor de atributo y devolviendo SQLSTATE 01S02 (valor de opción cambiado). Si el atributo no se puede cambiar, el controlador debe devolver SQLSTATE HY024 (valor de atributo no válido).
Nota:
Al usar la agrupación de conexiones, una aplicación no debe ejecutar instrucciones SQL que cambien la base de datos o el contexto de la base de datos, como la instrucción USE database en SQL Server, que cambia el catálogo usado por un origen de datos.
Ejemplo de código
Consulte SQLBindParameter, SQLBulkOperations, SQLPutData y SQLSetPos.
Funciones relacionadas
Para obtener información sobre | Vea |
---|---|
Enlazar un búfer a una columna de un conjunto de resultados | Función SQLBindCol |
Cancelación del procesamiento de instrucciones | Función SQLCancel |
Cerrar el cursor | Función SQLCloseCursor |
Ejecución de una operación de confirmación o reversión | Función SQLEndTran |
Ejecución de una instrucción SQL | Función SQLExecDirect |
Captura de varias filas de datos | Función SQLFetch |
Capturar un bloque de datos o desplazarse por un conjunto de resultados | Función SQLFetchScroll |
Liberar un identificador de instrucción | Función SQLFreeStmt |
Devolver un nombre de cursor | Función SQLGetCursorName |
Capturar parte o toda una columna de datos | Función SQLGetData |
Devolver el siguiente parámetro para enviar datos | Función SQLParamData |
Preparación de una instrucción para su ejecución | Función SQLPrepare |
Envío de datos de parámetros en tiempo de ejecución | Función SQLPutData |
Establecimiento de un nombre de cursor | Función SQLSetCursorName |
Establecimiento de un atributo de instrucción | Función SQLSetStmtAttr |