2012-03-27 11 views
0

私は500株の名前を保持する文字列配列を持っています。今私は1000以上の株式の名前をalonwithのシンボルを保持する私のmysqlデータベース内のテーブルを持っています。私がしたいのは、私が持っているテーブルから500株のシンボルを取り出すことです。私は次のコードを試しましたjdbcからのデータの取得

Class.forName("com.mysql.jdbc.Driver"); 
Connection conn=DriverManager.getConnection("jdbc:mysql//localhost/mydatabase","user","pass"); 
PreparedStatement stmt = conn.prepareStatement("SELECT (NAME) FROM stocks1 WHERE FULLNAME =?"); 
for(int i1=0;i1<i;i1++) 
{ 
    stmt.setString(1, name[i1]); 


    stmt.addBatch(); 
} 
ResultSet t=stmt.executeQuery(); 
while(t.next()) 
    System.out.println(t.getString("NAME")); 

しかし、それは動作しません。何も印刷されません。私はstmt.addBatch()で間違いをしていると思います。また、名前[i1]にワイルドカード文字(%)を付けるにはどうすればよいのでしょうか?

+1

バッチ処理は、クエリではなく、DMLステートメントに対するものです。検索するIDごとにSELECTを実行するか、WHERE IN(...)を使用する必要があります(プリペアドステートメントでは使用できません) –

+0

http://stackoverflow.com/questions/7899543/in参照-java-can-prepared-statement-select-for-select-queries- –

+0

@ Riddhish.Chaudhari-上記の質問に対する答えのリンクには何らかのエラーがあるようです。@ ahorsewithnoname、 - select文をforループに入れて実行します。 – user1092042

答えて

1

あなたの文字列配列内の株式のテーブルを作成し、あなたのstocks1テーブルとの結合を行うことができます。ワイルドカードを含むため

Class.forName("com.mysql.jdbc.Driver"); 
Connection conn=DriverManager.getConnection("jdbc:mysql//localhost/mydatabase","user","pass"); 
PreparedStatement stmt = conn.prepareStatement("SELECT NAME FROM stocks1 WHERE FULLNAME is in (SELECT FULLNAME FROM arraystocks)"); 
ResultSet t=stmt.executeQuery(); 
while(t.next()) { 
    System.out.println(t.getString("NAME")); 
} 
+0

これは、新しいテーブルを作成することを意味します。これを行う他の方法はありますか? – user1092042

+0

一時テーブルを使用できます。一時テーブルは、トランザクションを閉じた後に自動的に削除されます。しかし、mysqlがこれをサポートしているかどうかは分かりません。しかし、テーブルがなければ、自分で言及したようにループする必要があります。クエリがパフォーマンス上重要な場合は、 'where in ..(.. in)'を使用する必要があります。しかし、ステートメントの長さは通常制限されているので、ストック名のチャンクを処理する必要があります。 1つのクエリで100株。 – Andreas

+0

私はあなたの答えを使用しましたが、(SELECT FULLNAME FROM ...)に構文例外がスローされます。 – user1092042

1

以下に示すように、あなたが行うことができます:

のは、あなたのarraystocksのテーブルを言ってみましょうが、コードは次のようになり、1つの列FULLNAMEとstocksperuser名前が付けられます。あなたのSELECT文で

は削除=とsetStringメソッドで%を追加

PreparedStatement stmt = conn.prepareStatement("SELECT (NAME) FROM stocks1 WHERE FULLNAME LIKE ?"); 

LIKE追加します。

ps.setString(1, name[i1]+ "%"); 

はまた、空の行の問題のために、比較列の両方のケースかどうかを確認してくださいは同じであり、どちらかの彼らは、上または下にする必要があります。 そうでない場合、以下のように比較しながら変換することができます。

SELECT (NAME) FROM stocks1 WHERE upper(FULLNAME) LIKE ? 

ps.setString(1, upper(name[i1])+ "%");