개발 가이드

Local Navigation

SQL 매개 변수 사용

SQL 문을 만들 때, SQL 매개 변수를 만들어 문을 다른 값으로 다시 사용할 수 있습니다. 이 방식은 성능상 이점이 있습니다. 명명된 변수를 사용하는 일반 문을 준비한 후, 필요 시 변수 값을 통해 반복하고 각 반복 시 명명된 변수에 값을 연결하여 문을 실행할 수 있습니다.

executeInsert 또는 executeUpdate 메소드를 사용하는 경우 bindParams 매개 변수를 사용하여 매개 변수를 메소드에 올바르게 연결합니다. bindParams는 null, Integer, Long, Boolean, Float, Double, String 또는 ByteBuffers의 조합인 객체의 배열을 받습니다. 예는 다음과 같습니다.

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

execute 메소드 또는 getCursor 메소드를 사용하는 경우 Statement.bind 메소드를 사용하여 SQL 매개 변수에 대한 이름을 제공합니다. bind() 메소드는 매개 변수의 번호와 여기에 연결된 값을 취합니다. 허용 범위를 벗어나는 숫자를 사용할 경우, DatabaseException이 표시됩니다. 모든 연결은 Statement.reset을 사용하여 재설정할 수 있습니다.

다음 방법 중 하나를 선택하여 매개 변수에 번호를 부여할 수 있습니다.

  • 문의 물음표(?)는 각 매개 변수에 1부터 시작하여 순차적으로 번호가 부여되도록 합니다.

  • 문에서 물음표 뒤에 오는 정수(?NNN)는 각 매개 변수에 NNN번을 부여합니다.

다음은 매개 변수를 사용하여 문이 실행될 때마다 정의될 수 있는 상한 및 하한을 만드는 문의 예입니다. 이 예에서는 매개 변수에 순차적으로 번호가 부여됩니다.

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

매개 변수에 대해 명시적 숫자가 지정된 것을 제외하고는 같은 문입니다.

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

Statement.getFormalName 메소드는 매개 변수 색인을 SQL 매개 변수 이름으로 변환합니다. getFormalName에서 매개 변수 이름을 반환하려면 쿼리에 이름을 제공해야 합니다. 예를 들어, getFormalName(1)을 호출할 때 "SELECT * FROM T WHERE a = :a" 문이 :a를 반환합니다. 물음표(?)와 같은 매개 변수가 자리 표시자로 사용되면 getFormalName()이 매개 변수 이름을 반환하지 못합니다. 예를 들어, getFormalName(1)"SELECT * FROM T WHERE a = ?" 문의 매개 변수에 대해 이름을 반환하지 않습니다.

코드 샘플: 매개 변수화된 업데이트 작성

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

코드 샘플: 매개 변수화된 삽입문 작성

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();
    }
}
}
다음 주제: pragma 사용

이 정보가 도움이 되었습니까? 의견을 보내 주십시오.