Guia do desenvolvedor

Local Navigation

Uso de parâmetros SQL

Ao criar uma instrução SQL, é possível criar parâmetros SQL para reutilizar a instrução com diferentes valores. Esta prática pode fornecer benefícios de desempenho. Você pode preparar instruções genéricas que usam variáveis nomeadas e, em seguida, executar as instruções quando forem exigidas através da iteração pelos valores das variáveis, associando os valores às variáveis nomeadas em cada iteração.

Ao usar os métodos executeInsert ou executeUpdate, você une parâmetros diretamente no método com o parâmetro bindParams. bindParams pega uma matriz de objetos, que pode ser qualquer combinação de Null, Integer, Long, Boolean, Float, Double, String ou ByteBuffers. Aqui está um exemplo:

Statement st = d.createStatement("UPDATE Account set Balance = ? WHERE AcctNo > ?");
try
{
     st.prepare();
     Object[] bindParams = {new Integer (2000), new Integer (100)};
     st.executeUpdate(bindParams);
}
finally 
{
     st.close();
} 

Ao usar o método execute ou getCursor, você pode usar o método Statement.bind para fornecer nomes para parâmetros SQL. O método bind() tem o número do parâmetro e o valor a ser vinculado a ele. Se você usar um número fora do alcance permitido, um DatabaseException é lançado. Todas as uniões podem ser redefinidas usando Statement.reset.

Opte por uma das seguintes maneiras para numerar os parâmetros:

  • Um ponto de interrogação (?) na instrução faz com que cada parâmetro seja numerado seqüencialmente, iniciando com 1.

  • Um ponto de interrogação seguido por um número inteiro (?NNN) na instrução fornece a cada parâmetro o número NNN.

Este é um exemplo de uma instrução que usa parâmetros para criar um limite superior e um limite inferior que pode ser definido sempre que a instrução é executada. Este exemplo numera os parâmetros sequencialmente.

Statement s = Database.createStatement("SELECT * FROM T WHERE a < ? AND a > ?");
    s.prepare();
    s.bind(1, upperBound);
    s.bind(2, lowerBound);
    Cursor c = s.getCursor();

Aqui está a mesma instrução, exceto pelo fato de que números explícitos são especificados para os parâmetros:

Statement s = Database.createStatement("SELECT * FROM T WHERE a < ?5 AND a > ?12");
    s.prepare();
    s.bind(5, upperBound); 
    s.bind(12, lowerBound);
    Cursor c = s.getCursor();

O método Statement.getFormalName converte um índice de parâmetro em um nome de parâmetro SQL. Se você deseja que getFormalName retorne o nome do parâmetro, você deve fornecer um nome em uma consulta. Por exemplo, quando você chama getFormalName(1), a instrução "SELECT * FROM T WHERE a = :a" retorna :a. Quando parâmetros como um ponto de interrogação (?) são usados como placeholders, getFormalName() não pode retornar o nome de um parâmetro. Por exemplo, getFormalName(1) não retornará o nome do parâmetro nesta instrução: "SELECT * FROM T WHERE a = ?"

Exemplo de código: Criando uma atualização parametrizada

import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.database.*;
import net.rim.device.api.io.*;
import java.util.*;
public class ParameterizedUpdate extends UiApplication
{
    public static void main(String[] args)
    {
        ParameterizedUpdate theApp = new ParameterizedUpdate();
        theApp.enterEventDispatcher();
    }
    public ParameterizedUpdate()
    {
        pushScreen(new ParameterizedUpdateScreen());
    }
    }
    class ParameterizedUpdateScreen extends MainScreen
    {
        Database d;
        public ParameterizedUpdateScreen()
        {
            LabelField title = new LabelField("SQLite Parameterized Update Sample",
            LabelField.ELLIPSIS |
            LabelField.USE_ALL_WIDTH);
            setTitle(title);
            add(new RichTextField("Attempting to update data in " +
              "MyTestDatabase.db on the SDCard."));
            try
            {
               URI myURI = URI.create("file:///SDCard/Databases/SQLite_Guide/" +
                 "MyTestDatabase.db");
               d = DatabaseFactory.open(myURI);
               Statement st = d.createStatement(
                 "UPDATE People SET Age=? WHERE Name=?");
               st.prepare();
               Hashtable ht = new Hashtable(2);
               ht.put("Sophie", new Integer(10));
               ht.put("Karen",  new Integer(7));
               Enumeration names = ht.keys();
               Enumeration ages  = ht.elements();
               while (names.hasMoreElements())
               {
                   Integer iAge   = (Integer)ages.nextElement();
                   String strName = (String)names.nextElement();
                   st.bind(1,iAge.intValue());
                   st.bind(2,strName);
                   st.execute();
                   st.reset();
               }
               st.close();
               d.close();
        }
        catch ( Exception e )
        {
            System.out.println( e.getMessage() );
            e.printStackTrace();
        }
    }
}

Exemplo de código: Criando uma inserção parametrizada

import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.database.*;
import net.rim.device.api.io.*;
import java.util.*;
public class ParameterizedInsert extends UiApplication
{
public static void main(String[] args)
{
   ParameterizedInsert theApp = new ParameterizedInsert();
      theApp.enterEventDispatcher();
}
public ParameterizedInsert()
{
   pushScreen(new ParameterizedInsertScreen());
}
}
class ParameterizedInsertScreen extends MainScreen
{
   Database d;
   public ParameterizedInsertScreen()
   {
      LabelField title = new LabelField("SQLite Insert Data " +
      "Schema Sample",
      LabelField.ELLIPSIS |
      LabelField.USE_ALL_WIDTH);
      setTitle(title);
      add(new RichTextField("Attempting to insert data into " +
      "MyTestDatabase.db on the SDCard."));
    try
    {
       URI myURI = URI.create("file:///SDCard/Databases/SQLite_Guide/" +
       "MyTestDatabase.db");
       d = DatabaseFactory.open(myURI);
       Statement st = d.createStatement("INSERT INTO People(Name,Age) " +
       "VALUES (?,?)");
       st.prepare();
       Hashtable ht = new Hashtable(4);
       ht.put("Sophie", new Integer(6));
       ht.put("Karen",  new Integer(3));
       ht.put("Kevin",  new Integer(82));
       ht.put("Cindy",  new Integer(12));
       Enumeration names = ht.keys();
       Enumeration ages  = ht.elements();
       while (names.hasMoreElements())
       {
          String strName = (String)names.nextElement();
          Integer iAge   = (Integer)ages.nextElement();
          st.bind(1,strName);
          st.bind(2,iAge.intValue());
          st.execute();
          st.reset();
       }
       st.close();
       d.close();
    }
    catch ( Exception e )
    {
       System.out.println( e.getMessage() );
       e.printStackTrace();
    }
}
}
Próximo tópico: Usar pragmas

Estas informações foram úteis? Gostaríamos de receber seus comentários.