13.7. Sintaxis SQL de sentencias preparadas

MySQL 5.0

13.7. Sintaxis SQL de sentencias preparadas

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.3.4, “Sentencias preparadas de la API C”. Otras interficies 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:

PREPARE  FROM ;

EXECUTE  [USING @ [, @] ...];

{DEALLOCATE | DROP} PREPARE ;

El comando prepara un comando y le asigna un nombre, , con el que referirse al comando posteriormente. Los nombres de comando no son sensibles a mayúsculas. 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 carácteres '' como marcadores de parámetros para indicar dónde estarán los valores en la consulta posterior cuando la ejecute. Los carácteres '' 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 que se refiere al nombre de comando preparado. Si el comando preparado contiene cualquier marcador de parámetro, debe añadir una cláusula 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 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 . 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: , , , , , , , , y la mayoría de comandos . 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 no puede ser el mismo un comando , , o .

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 de la API C para preparar un comando , , o .

La sintaxis SQL para comandos preparados no puede usarse dentro de procedimientos almacenados y funciones.