MySQL 5.0 proporciona soporte para comandos preparados en la parte del servidor. Este soporte aprovecha del protocolo binario cliente-servidor implementado en MySQL 4.1, dado que use una interfaz de programación cliente apropiada. Las interfaces candidatas incluyen la biblioteca de la API de C de MySQL y MySQL Connector/NET. Por ejemplo, la API C proporciona un conjunto de llamadas de funciones que prepararn su API de comandos preparados. Consulte Sección 24.2.4, “Sentencias preparadas de la API C”. Otras interfaces de lenguajes pueden proporcionar soporte para comandos preparados que usen el protocolo binario enlazando la biblioteca cliente C, un ejemplo es la extensión mysqli extension in PHP 5.0.
Una interfaz SQL alternativa para comandos preparados está disponible Su intefaz no es tan eficiente como usar el protocolo binario mediante una API de comandos preparados, pero no necesita programación porque está disponible directamente a nivel SQL:
Puede usarlo cuando no haya interfaz programable diponible
Puede usarlo desde cualquier programa que le permita enviar comandos SQL al servidor, tales como el programa cliente mysql .
Puede usarlo incluso si el cliente está usando una antigua versión de la biblioteca cliente. El único requerimiento es que sea capaz de conectar a un servidor lo suficientemente reciente para soporta sintaxis SQL para comandos preparados.
La sintaxis SQL para comandos preparados está pensada para usar en situaciones como la siguiente:
Puede querer testear cómo fucionan los comandos preparados en su aplicación antes de codificar la aplicación. O quizás una aplicación tenga un problema ejecutando comandos preparados y quiera determinar interactivamente cuál es el problema.
Quiere crear un test de uso que describa un problema que está teniendo con comandos preparados, así que puede perparar un reporte de error.
Necesita usar comandos preparados pero no tiene acceso a la API de programación que los soporta.
La sintaxis SQL para comandos preparados se abasa en tres comandos SQL:
PREPAREstmt_name
FROMpreparable_stmt
; EXECUTEstmt_name
[USING @var_name
[, @var_name
] ...]; {DEALLOCATE | DROP} PREPAREstmt_name
;
El comando PREPARE
prepara un comando y le
asigna un nombre, stmt_name
, con el que
referirse al comando posteriormente. Los nombres de comando no son
sensibles a mayúsculas.
preparable_stmt
es una cadena literal o
una variable de usuario que contenga el texto del comando. El
texto debe representar un comando SQL único, no varios. Dentro
del comando, pueden usarse caracteres '?
' como
marcadores de parámetros para indicar dónde estarán los valores
en la consulta posterior cuando la ejecute. Los caracteres
'?
' no deben delimitarse con comillas, incluso
si pretende ligarlos con valores de cadenas.
Si un comando preparado con ese nombre existe, se elimina implícitamente antes que se prepare el nuevo comando. Esto significa que si el nuevo comando contiene un error y no puede preparase, se retorna un error y no existe un comando con el nombre dado.
El alcance de los comandos preparados es la sesión de cliente dentro de la que se crea. Otros clintes no pueden verlos.
Tras preparar un comando, lo ejecuta con un comando
EXECUTE
que se refiere al nombre de comando
preparado. Si el comando preparado contiene cualquier marcador de
parámetro, debe añadir una cláusula USING
que liste las variables de usuario conteniendo los valores a ligar
con los parámetros. Los valores de parámetros pueden
proporcionarse sólo por variables de usuario, y la cláusula
USING
debe nombrar exactamente tantas variables
como el número de marcadores de parámetros en el comando.
Puede ejecutar un comando preparado dado varias veces, pasando distintas variables al mismo o configurando las variables con distintos valores para cada ejecución.
Para eliminar un comando preparado, use el comando
DEALLOCATE PREPARE
. Tratar de ejecutar un
comando preparado tras borrarlo provoca un error.
Si termina una sesión de cliente sin borrar un comando preparado préviamente, el servidor lo borra automáticamente.
Los siguientes comandos SQL pueden usarse en comandos preparados:
CREATE TABLE
, DELETE
,
DO
, INSERT
,
REPLACE
, SELECT
,
SET
, UPDATE
, y la mayoría
de comandos SHOW
. Otros comandos no se
soportan todavía.
Los siguientes ejemplos muestran dos formas equivalentes de preparar un comando que calcula la hipotenusa de un triángulo dadas las longitudes de los dos catetos.
El primer ejemplo muestra cómo crear un comando preparado usando una cadena literal para proporcionar el texto del comando:
mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; mysql> SET @a = 3; mysql> SET @b = 4; mysql> EXECUTE stmt1 USING @a, @b; +------------+ | hypotenuse | +------------+ | 5 | +------------+ mysql> DEALLOCATE PREPARE stmt1;
El segundo ejemplo es similar, pero proporciona el texto del comando como variable de usuario:
mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; mysql> PREPARE stmt2 FROM @s; mysql> SET @a = 6; mysql> SET @b = 8; mysql> EXECUTE stmt2 USING @a, @b; +------------+ | hypotenuse | +------------+ | 10 | +------------+ mysql> DEALLOCATE PREPARE stmt2;
La sintaxis SQL para comandos preparados no puede usarse anidada.
Esto es, un comando pasado a PREPARE
no puede
ser el mismo un comando PREPARE
,
EXECUTE
, o DEALLOCATE
PREPARE
.
Además, la sintaxis SQL para comandos preparados es distinta de
la usada en llamadas a la API de comandos preparados. Por ejemplo,
use la función mysql_stmt_prepare()
de la API
C para preparar un comando PREPARE
,
EXECUTE
, o DEALLOCATE
PREPARE
.
La sintaxis SQL para comandos preparados no puede usarse dentro de procedimientos almacenados y funciones.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.