L’ajout d’un paramètre dans une instruction SQL permet de créer une instruction SQL réutilisable. Lorsque vous ajoutez des paramètres à une instruction, les valeurs de celle-ci peuvent changer (les valeurs ajoutées à une instruction
INSERT
, par exemple), mais le texte de base de l’instruction ne change pas. C’est pourquoi l’ajout de paramètres constitue un avantage en termes de performances et simplifie le codage des applications.
Présentation des paramètres d’instruction
Il est fréquent qu’une application utilise plusieurs fois une même instruction SQL, avec de légères variations. Prenons par exemple le cas d’une application de suivi de stock qui permet à l’utilisateur d’ajouter de nouveaux articles dans la base de données. Le code de l’application qui ajoute un article de stock dans la base de données exécute une instruction SQL
INSERT
qui ajoute véritablement les données dans la base de données. Toutefois, chaque exécution de l’instruction présente une légère variation. En particulier, les véritables valeurs insérées dans la table diffèrent puisqu’elles sont spécifiques à l’article ajouté au stock.
Lorsqu’une instruction SQL est utilisée plusieurs fois avec des valeurs différentes dans l’instruction, la meilleure approche consiste à utiliser une instruction SQL incluant des paramètres plutôt que des valeurs littérales dans le texte SQL. Un paramètre est un espace réservé dans le texte de l’instruction qui est remplacé par une valeur réelle à chaque exécution de l’instruction. Pour utiliser des paramètres dans une instruction SQL, vous créez une occurrence de
SQLStatement
standard. Dans le cas de la véritable instruction SQL affectée à la propriété
text
, utilisez des espaces réservés aux paramètres plutôt que des valeurs littérales. Définissez ensuite la valeur de chaque paramètre en définissant la valeur d’un élément dans la propriété
parameters
de l’occurrence de SQLStatement. La propriété
parameters
étant un tableau associatif, définissez une valeur déterminée à l’aide de la syntaxe suivante :
statement.parameters[parameter_identifier] = value;
parameter_identifier
est une chaîne si vous utilisez un paramètre nommé ou un index de nombres entiers si vous utilisez un paramètre non nommé.
Utilisation de paramètres nommés
Un paramètre peut être un paramètre nommé. Un paramètre nommé a un nom spécifique que la base de données utilise pour mettre en correspondance sa valeur avec l’emplacement de l’espace réservé dans le texte de l’instruction. Un nom de paramètre se compose du caractère « : » ou « @ » suivi d’un nom, comme dans les exemples suivants :
:itemName
@firstName
Le code suivant décrit l’utilisation des paramètres nommés :
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();
Utilisation de paramètres non nommés
En alternative à l’utilisation de paramètres nommés, vous pouvez utiliser des paramètres non nommés. Pour utiliser un paramètre non nommé, vous désignez un paramètre dans une instruction SQL en utilisant un caractère « ? » . Un index numérique est affecté à chaque paramètre, par ordre d’apparition des paramètres dans l’instruction, en commençant par l’index 0 pour le premier paramètre. L’exemple suivant est une version différente de l’exemple précédent, à l’aide de paramètres non nommés :
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();
Avantages de l’utilisation de paramètres
L’utilisation de paramètres dans une instruction SQL présente plusieurs avantages :
-
Performances optimisées
-
L’exécution d’une occurrence de SQLStatement avec paramètres est plus efficace que celle d’une occurrence qui crée dynamiquement le texte SQL à chaque exécution. L’amélioration des performances est due au fait que l’instruction n’est préparée qu’une seule fois mais peut ensuite être exécutée à plusieurs reprises avec des valeurs différentes de paramètres, sans qu’il soit nécessaire de recompiler l’instruction SQL.
-
Typage explicite des données
-
Les paramètres autorisent la substitution avec type de valeurs inconnues au moment de la construction de l’instruction SQL. L’utilisation des paramètres est le seul moyen de garantir la classe de stockage d’une valeur transmise à la base de données. Lorsque les paramètres ne sont pas utilisés, le moteur d’exécution tente de convertir toutes les valeurs de leur représentation texte en une classe de stockage en fonction de l’affinité du type de la colonne associée.
Pour plus d’informations sur les classes de stockage et l’affinité des colonnes, voir
Prise en charge des types de données
.
-
Sécurité renforcée
-
Les paramètres sont également utilisés comme mesure de sécurité pour prévenir toute technique malveillante appelée attaque par injection de code SQL. Dans une attaque par injection de code SQL, l’utilisateur entre du code SQL dans un emplacement accessible (par exemple dans un champ de saisie). Si le code de l’application construit une instruction SQL en concaténant directement la saisie de l’utilisateur dans le texte SQL, le code SQL saisi par l’utilisateur est exécuté sur la base de données. L’exemple suivant illustre la concaténation de la saisie de l’utilisateur dans le texte SQL.
N’utilisez pas cette technique
:
// 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;
Le fait d’utiliser des paramètres d’instruction plutôt que la concaténation de valeurs saisies par utilisateur dans le texte d’une instruction permet d’éviter les attaques par injection de code SQL. L’attaque par injection de code SQL ne peut se produire car les valeurs des paramètres sont traitées explicitement sous forme de valeurs substituées au lieu de devenir une partie du texte de l’instruction littérale. L’exemple suivant est l’alternative recommandée :
// 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;
|
|
|