Guía de desarrollo

Local Navigation

Uso de parámetros de SQL

Al crear una instrucción de SQL, puede crear parámetros de SQL con el fin de reutilizar la instrucción con valores diferentes. Esta práctica puede proporcionar ventajas de rendimiento. Puede preparar instrucciones genéricas que utilicen variables con nombre y, a continuación, ejecutar las instrucciones cuando sean necesarias mediante la iteración a través de los valores de la variable, vinculando los valores a las variables con nombre en cada iteración.

Al utilizar los métodos executeInsert o executeUpdate, los parámetros se vinculan con el método que tiene el parámetro bindParams. bindParams toma una matriz de objetos, que puede ser cualquier combinación de Null, Integer, Long, Boolean, Float, Double, String o ByteBuffers. Aquí se muestra un ejemplo:

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();
} 

Cuando utilice los métodos execute o getCursor, puede utilizar el método Statement.bind con el fin de proporcionar los nombres para los parámetros de SQL. El método bind() toma el número del parámetro y el valor que se va a vincular al mismo. Si utiliza un número fuera del intervalo permitido, se genera una excepción DatabaseException. Todas las vinculaciones se pueden restablecer mediante Statement.reset.

Puede elegir entre los siguientes métodos para enumerar los parámetros:

  • Un signo de interrogación (?) en la instrucción da lugar a la enumeración secuencial de cada parámetro, comenzando por el 1.

  • Un signo de interrogación seguido de un valor entero (?NNN) en la instrucción proporciona a cada parámetro el número NNN.

A continuación, se ofrece un ejemplo de una instrucción que utiliza los parámetros para crear un límite superior y un límite inferior que se podrán definir cada vez que se ejecute la instrucción. Este ejemplo enumera los parámetros de forma secuencial.

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();

Este ejemplo es la misma instrucción, salvo por los números explícitos especificados para los 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();

El método Statement.getFormalName convierte un índice de parámetros en un nombre de parámetro de SQL. Si desea devolver el nombre de parámetro getFormalName, debe proporcionar un nombre en la consulta. Por ejemplo, cuando llama a getFormalName(1), la instrucción "SELECT * FROM T WHERE a = :a" devuelve :a. Cuando se utilizan parámetros como un signo de interrogación (?) como marcadores de posición, getFormalName() no puede devolver un nombre de parámetro. Por ejemplo, getFormalName(1) no devolverá el nombre para el parámetro en esta instrucción: "SELECT * FROM T WHERE a = ?"

Ejemplo de código: crear una actualización con parámetros

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();
        }
    }
}

Ejemplo de código: crear una inserción con parámetros

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();
    }
}
}
Tema siguiente: Uso de pragmas

¿Le ha resultado útil esta información? Envíenos sus comentarios.