O uso de parâmetros de instrução SQL permite criar uma instrução SQL reutilizável. Quando você usa parâmetros de instrução, os valores na instrução podem mudar (como os que estão sendo adicionados a uma instrução
INSERT
), mas seu texto básico permanece inalterado. Consequentemente, usar parâmetros oferece o benefício do desempenho, além de facilitar a codificação de um aplicativo.
Noções básicas sobre parâmetros de instrução
É frequente um aplicativo usar uma única instrução SQL várias vezes, com uma leve variação. Por exemplo, considere um aplicativo de controle de inventário no qual um usuário pode adicionar itens de inventário ao banco de dados. O código do aplicativo que adiciona um item de inventário ao banco de dados executa uma instrução SQL
INSERT
que, na verdade, adiciona os dados ao banco de dados. No entanto, cada vez que a instrução é executada, há uma leve variação. Especificamente, os valores reais inseridos na tabela são diferentes porque são específicos do item de inventário que está sendo adicionado.
Em casos nos quais você tem uma instrução SQL que é usada várias vezes com diferentes valores na instrução, a melhor abordagem é utilizar uma instrução SQL que inclua parâmetros em vez de valores literais no texto SQL. Um parâmetro consiste em um alocador de espaço no texto da instrução que é substituído por um valor real sempre que a instrução é executada. Para usar parâmetros em uma instrução SQL, crie a instância de
SQLStatement
como de costume. No caso da instrução SQL propriamente dita atribuída à propriedade
text
, use alocadores de espaço de parâmetro em vez de valores literais. Em seguida, defina o valor para cada parâmetro definindo o valor de um elemento na propriedade
parameters
da ocorrência de SQLStatement. A propriedade
parameters
é uma matriz associativa, por isso você define um valor em particular usando a seguinte sintaxe:
statement.parameters[parameter_identifier] = value;
parameter_identifier
é uma string (se você está usando um parâmetro nomeado) ou um índice de inteiro (se está usando um parâmetro sem nome).
Uso de parâmetros nomeados
Um parâmetro pode ser um parâmetro nomeado. Um parâmetro nomeado tem um nome específico que o banco de dados utiliza para comparar o valor do parâmetro à localização do alocador de espaço no texto da instrução. Um nome de parâmetro consiste no caractere “:” ou “@” seguido de um nome, como nestes exemplos:
:itemName
@firstName
A seguinte listagem de código demonstra o uso de parâmetros nomeados:
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 sem nome
Como alternativa ao uso de parâmetros nomeados, também é possível utilizar parâmetros sem nome. Para usar um parâmetro sem nome, indique um parâmetro em uma instrução SQL usando um caractere “?” exigido. Cada parâmetro recebe um índice numérico conforme a ordem dos parâmetros da instrução, começando com o índice 0 para o primeiro parâmetro. Este exemplo demonstra uma versão do exemplo anterior usando parâmetros sem nome:
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();
Benefícios do uso de parâmetros
O uso de parâmetros em uma instrução SQL proporciona vários benefícios:
-
Melhor desempenho
-
Uma ocorrência de SQLStatement que usa parâmetros é executada com mais eficiência se comparada a uma que cria o texto SQL dinamicamente sempre que é executada. A melhoria do desempenho ocorre porque a instrução é preparada uma única vez e pode ser executada várias vezes usando-se diferentes valores de parâmetro, sem a necessidade de recompilar a instrução SQL.
-
Digitação de dados explícita
-
Os parâmetros são usados para permitir a substituição de valores digitados que são desconhecidos no momento em que a instrução SQL é construída. O uso de parâmetros é o único modo de garantir a classe de armazenamento para um valor passado ao banco de dados. Quando parâmetros não são usados, o tempo de execução tenta converter todos os valores de sua representação em texto para uma classe de armazenamento com base na afinidade de tipo da coluna associada.
Para obter mais informações sobre classes de armazenamento e afinidade de coluna, consulte
Suporte ao tipo de dados
.
-
Mais segurança
-
O uso de parâmetros ajuda a impedir uma técnica mal-intencionada conhecida como ataque de injeção SQL. Em um ataque de injeção SQL, um usuário insere o código SQL em um local acessível ao usuário (por exemplo, um campo de entrada de dados). Se o código do aplicativo construir uma instrução SQL concatenando diretamente a entrada do usuário no texto SQL, o código SQL inserido pelo usuário será executado em relação ao banco de dados. A lista a seguir mostra um exemplo de concatenação da entrada do usuário no texto SQL.
Não use 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;
O uso de parâmetros de instrução em vez de concatenar valores inseridos pelo usuário no texto de uma instrução impede o ataque de injeção SQL. A injeção de SQL não ocorre porque os valores de parâmetro são tratados explicitamente como valores substituídos, em vez de se tornarem parte do texto da instrução literal. Esta é uma alternativa recomendável à listagem 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;
|
|
|