Uso de parámetros en sentencias

Adobe AIR 1.0 y posterior

Una parámetro de declaración SQL permite crear una declaración SQL reutilizable. Cuando usa parámetros de declaración, los valores de la declaración pueden cambiar (como valores que se añaden en una declaración INSERT ), pero el texto básico de la declaración no cambia. Por lo tanto, el uso de parámetros proporciona ventajas de rendimiento y facilita la codificación de una aplicación.

Aspectos básicos de parámetros de declaración

Con frecuencia, una aplicación usa una sola declaración SQL varias veces en una aplicación, con leves variaciones. Por ejemplo, considere una aplicación de seguimiento de inventario donde un usuario puede añadir nuevos elementos de inventario a la base de datos. El código de aplicación que añade un elemento de inventario a la base de datos ejecuta una declaración SQL INSERT que añade los datos a la base de datos. Sin embargo, cada vez que se ejecuta la declaración hay una leve variación. En concreto, los valores reales que se insertan en la tabla son diferentes porque son específicos al elemento de inventario que se añade.

En los casos donde se tiene una declaración SQL que se usa múltiples veces con diferentes valores en la declaración, el mejor método es usar una declaración SQL que incluye parámetros en lugar de valores literales en el texto SQL. Un parámetro es un marcador de posición en el texto de la declaración que se remplaza con un valor real cada vez que se ejecuta la declaración. Para utilizar parámetros en una declaración SQL, se crea una instancia de SQLStatement , como es habitual. Para la declaración SQL real asignada a la propiedad text , use los marcadores de posición de parámetros en vez de valores literales. Luego defina el valor para cada parámetro configurando el valor de un elemento en la propiedad parameters de la instancia SQLStatement. La propiedad parameters es un conjunto asociativo, por lo que define un valor determinado usando la siguiente sintaxis:

statement.parameters[parameter_identifier] = value;

El valor parameter_identifier es una cadena si está usando un parámetro con nombre o un índice de número entero si está usando un parámetro sin nombre.

Uso de parámetros con nombre

Un parámetro puede ser un parámetro con nombre. Un parámetro con nombre tiene un nombre específico que la base de datos usa para corresponder el valor del parámetro con la ubicación del marcador de posición en el texto de la declaración. Un nombre de parámetro contiene de un carácter “:” o “@” seguido por el nombre, como en los siguientes ejemplos:

:itemName 
@firstName

El siguiente ejemplo de código demuestra el uso de parámetros con nombre:

var sql:String =  
    "INSERT INTO inventoryItems (name, productCode)" + 
    "VALUES (:name, :productCode)"; 
     
var addItemStmt:SQLStatement = new SQLStatement(); 
addItemStmt.sqlConnection = conn; 
addItemStmt.text = sql; 
     
// set parameter values 
addItemStmt.parameters[":name"] = "Item name"; 
addItemStmt.parameters[":productCode"] = "12345"; 
     
addItemStmt.execute(); 

Uso de parámetros sin nombre

Como una alternativa al uso de parámetros con nombre, también se pueden utilizar parámetros sin nombre. Para usar un parámetro sin nombre se indica un parámetro en una declaración SQL usando un signo de interrogación “?” . A cada parámetro se le asigna un índice numérico, según el orden de los parámetros en la declaración, comenzando con el índice 0 para el primer parámetro. En el siguiente ejemplo se muestra una versión del ejemplo anterior, usando parámetros sin nombre:

var sql:String =  
    "INSERT INTO inventoryItems (name, productCode)" + 
    "VALUES (?, ?)"; 
     
var addItemStmt:SQLStatement = new SQLStatement(); 
addItemStmt.sqlConnection = conn; 
addItemStmt.text = sql; 
     
// set parameter values 
addItemStmt.parameters[0] = "Item name"; 
addItemStmt.parameters[1] = "12345"; 
     
addItemStmt.execute(); 

Ventajas de utilizar parámetros

El uso de parámetros en una declaración SQL proporciona varias ventajas:

Mejor rendimiento
Una instancia SQLStatement que utiliza parámetros puede ejecutarse más eficazmente comparada con una que crea dinámicamente el texto SQL cada vez que se ejecuta. La mejora del rendimiento se debe a que la declaración se prepara una sola vez y se puede ejecutar múltiples veces usando diferentes valores de parámetro, sin tener que volver a compilar la declaración SQL.

Introducción de datos explícita
Se utilizan los parámetros para permitir la sustitución de valores introducidos que se desconocen en el momento de la construcción de la declaración SQL. La utilización de parámetros es la única manera de garantizar la clase de almacenamiento para un valor pasado en la base de datos. Cuando no se utilizan parámetros, el motor de ejecución intenta convertir todos los valores de la representación de texto a una clase de almacenamiento en la afinidad de tipo de la columna asociada.

Para obtener más información sobre las clases de almacenamiento y la afinidad de columnas, consulte Compatibilidad de tipos de datos .

Mayor seguridad
El uso de los parámetros ayuda a prevenir la ejecución de una técnica malintencionada conocida como ataque de inyección SQL. En un ataque de inyección SQL, un usuario introduce un código SQL en una ubicación accesible al usuario (por ejemplo, un campo de introducción de datos) Si el código de aplicación crea una declaración SQL directamente concatenando entradas del usuario en el texto SQL, el código SQL introducido por el usuario se ejecuta con la base de datos. A continuación se muestra un ejemplo de entradas del usuario concatenadas en el texto SQL. No utilice esta técnica :
// assume the variables "username" and "password" 
// contain user-entered data 
     
var sql:String = 
    "SELECT userId " + 
    "FROM users " + 
    "WHERE username = '" + username + "' " + 
    "    AND password = '" + password + "'"; 
     
var statement:SQLStatement = new SQLStatement(); 
statement.text = sql; 

La utilización de parámetros de instrucción en lugar de valores introducidos por el usuario concatenados en un texto de declaración impide un ataque de inyección SQL. La inyección SQL no se puede llevar a cabo porque los valores de los parámetros se tratan explícitamente como valores sustituidos, en lugar de ser parte del texto de la declaración literal. La siguiente alternativa es la alternativa que se recomienda del ejemplo anterior:

// assume the variables "username" and "password" 
// contain user-entered data 
     
var sql:String = 
    "SELECT userId " + 
    "FROM users " + 
    "WHERE username = :username " + 
    "    AND password = :password"; 
     
var statement:SQLStatement = new SQLStatement(); 
statement.text = sql; 
     
// set parameter values 
statement.parameters[":username"] = username; 
statement.parameters[":password"] = password;