I parametri delle istruzioni SQL consentono la creazione di istruzioni SQL riutilizzabili. Se utilizzate parametri delle istruzioni, i valori all'interno delle istruzioni possono variare, ad esempio con l'aggiunta di valori nell'istruzione
INSERT
, ma il testo di base dell'istruzione rimane invariato. Di conseguenza, l'uso di parametri offre dei vantaggi in termini di prestazioni e semplifica la creazione del codice delle applicazioni.
Introduzione ai parametri delle istruzioni
Le applicazioni utilizzano spesso una singola istruzione ripetuta più volte con solo lievi variazioni. Ad esempio, ipotizziamo un'applicazione di gestione delle scorte tramite la quale l'utente può aggiungere al database nuovi elementi delle scorte. Il codice dell'applicazione che aggiunge gli elementi delle scorte al database esegue un'istruzione SQL
INSERT
che aggiunge effettivamente i dati al database. Tuttavia, ogni volta che l'istruzione viene eseguita, è presente una leggera variazione in quanto i valori effettivi che vengono inseriti nella tabella sono diversi, dato che si riferiscono specificamente a ciascun elemento delle scorte aggiunto.
Nei casi in cui si abbia un'istruzione SQL che viene utilizzata più volte con diversi valori, la migliore soluzione è usare un'istruzione SQL che comprende nel testo SQL dei parametri invece che dei valori letterali. I parametri sono segnaposti nel testo dell'istruzione che vengono sostituiti da un valore effettivo ogni volta che l'istruzione viene eseguita. Per utilizzare i parametri delle istruzioni SQL create normalmente l'istanza
SQLStatement
; per l'effettiva istruzione SQL assegnata alla proprietà
text
, usate segnaposti per i parametri invece che valori precisi. Si deve poi definire il valore di ciascun parametro impostando il valore di un elemento nella proprietà
parameters
dell'istanza SQLStatement. La proprietà
parameters
è una matrice associativa, il che significa che l'impostazione di un certo valore si effettua tramite la seguente sintassi.
statement.parameters[parameter_identifier] = value;
Il
parameter_identifier
è una stringa se si usa un parametro denominato o un indice intero se si usa un parametro non denominato.
Utilizzo dei parametri denominati
I parametri possono essere denominati, cioè possedere un nome specifico utilizzato dal database per far corrispondere il valore del parametro stesso alla posizione del relativo segnaposto nel testo dell'istruzione. I nomi dei parametri sono formati dal carattere “:” o “@” seguito da un nome come negli esempi seguenti.
:itemName
@firstName
Il seguente elenco di codici illustra l'utilizzo dei parametri denominati.
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();
Utilizzo dei parametri non denominati
L'alternativa all'utilizzo dei parametri denominati è l'utilizzo di quelli non denominati. Per utilizzare un parametro non denominato, lo si denota con un carattere “?” nell'istruzione SQL . A ciascun parametro viene assegnato un indice numerico che rispetta l'ordine dei parametri nell'istruzione e comincia dallo zero per il primo parametro. L'esempio seguente illustra un'altra versione dell'esempio precedente facendo uso dei parametri non denominati.
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();
Vantaggi dell'uso dei parametri
L'utilizzo dei parametri nelle istruzioni SQL offre diversi vantaggi.
-
Migliori prestazioni
-
Le istanze SQLStatement che usano i parametri possono venire eseguite in modo più efficiente rispetto a quelle che creano il testo SQL dinamicamente ogni volta che vengono eseguite. Il miglioramento delle prestazioni deriva dal fatto che l'istruzione viene preparata una sola volta e può poi venire eseguita più volte utilizzando diversi valori per i parametri senza che sia necessario ricompilarla.
-
Assegnazione esplicita di un tipo ai dati
-
I parametri si utilizzano per la sostituzione basata sul tipo di quei valori che risultano ignoti al momento della composizione dell'istruzione SQL e rappresentano l'unico modo di garantire la classe d'archivio dei valori passati nel database. Se non si usano i parametri, il runtime tenta di convertire tutti i valori dalla loro rappresentazione testuale ad una classe d'archivio sulla base dell'affinità del tipo della colonna ad essi associata.
Per ulteriori informazioni sulle classi d'archivio e l'affinità fra colonne, vedete
Supporto per i tipi di dati
.
-
Migliore protezione
-
L'utilizzo dei parametri contribuisce ad evitare che il database diventi vittima della tecnica di attacco nota come SQL injection. Nel caso di un attacco SQL injection, l'utente immette il codice SQL in una posizione accessibile agli utenti, ad esempio un campo per l'immissione dei dati. Se il codice dell'applicazione costruisce le istruzioni SQL concatenando direttamente l'immissione dell'utente nel testo SQL, il codice SQL immesso dall'utente viene eseguito nel database. L'elenco seguente mostra un esempio di concatenazione dei dati immessi dall'utente nel test SQL.
Non utilizzate questa tecnica
.
// 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;
L'utilizzo dei parametri nelle istruzioni al posto della concatenazione dei valori immessi dall'utente nel testo dell'istruzione evita gli attacchi SQL injection. SQL injection, infatti, non può avere luogo in quanto i valori dei parametri vengono trattati in modo esplicito come valori sostituiti invece che fare parte del testo letterale dell'istruzione. Raccomandiamo di attenervi all'elenco seguente invece che a quello illustrato in precedenza.
// 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;
|
|
|