Compartir por


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 un 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.

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

Consulte también

Referencia de API ODBC
Archivos de encabezado de ODBC