0

そこで、Javaを使用して、Javaのループの対象となる条件付きステートメント(以下)を条件として、SQLデータベースから選択を実行したいと思います。言い換えれば、次のようなものです。

for (int i=0; i< 195; i++) {
            // Get the results of the SQL query
            resultSet = statement.executeQuery( 
                    "SELECT max( millisFromMid ) FROM stockInfo1 WHERE ( millisFromMid <=  34200000 + (120000)*i ) GROUP BY stockID" 
                    );

この状態で「i」を使用する必要がないため、Javaはここで例外を返します。ただし、ここでは使用できないため、この状態をどのように変更できるかわかりません。問題はこれです:私はいくつかの操作を行い、結果を新しいデータベースに入れることを目的として、1つのデータベースからデータを取得しようとしています。これらの操作は、利用可能な最新のデータを取得することに依存します。そのため、millisFromMidの境界の数を増やしたいと考えています。それは理にかなっていますか?

誰かがこのようなことをする方法について誰かが提案を持っていますか?これは、JavaとSQLを一緒に使用する際の基本的なスキルのように思われるので、ぜひ知りたいと思います。

4

3 に答える 3

5

SQLステートメントは、Javaコードとは異なる環境(異なる言語、異なるスコープ)で解析および実行されます。SQLiteを使用しない限り、SQLステートメントは異なるプロセスまたは異なるマシンで実行されます。そのため、SQLコードからJava変数を参照するだけでは不十分です。Java変数iを挿入するか、特別なAPIを使用する必要があります。

最初のオプションであるinjectionは、iの値を文字列内に配置するだけです。

"SELECT max( millisFromMid ) FROM stockInfo1 WHERE ( millisFromMid <=  34200000 + (120000)*"+i+" ) GROUP BY stockID"

個人的に、私はそれを使用してそれを行うことを好みますString.format-しかしそれは私だけです。

String.format("SELECT max( millisFromMid ) FROM stockInfo1 WHERE ( millisFromMid <=  34200000 + (120000)*%d ) GROUP BY stockID",i)

2番目のオプション(API経由)はより複雑ですが、SQLパラメーターを使用する方が高速です(特にトランザクションと組み合わせる場合)。プリペアドステートメントを作成する必要があります。

PreparedStatement preparedStatement = connection.prepareStatement("SELECT max( millisFromMid ) FROM stockInfo1 WHERE ( millisFromMid <=  34200000 + (120000)*? ) GROUP BY stockID")

?それが置き換えられていることに注意してiください-これはあなたのパラメータです。prepareStatement ループの前に一度作成し、ループ内で毎回パラメータを設定して実行します。

for (int i=0; i< 195; i++) {
    preparedStatement.setInt(1,i); //Set the paramater to the current value of i.
    resultSet = preparedStatement.executeQuery(); //Execute the statement - each time with different value of the parameter.
}
于 2012-12-28T00:40:23.123 に答える
1

問題は、データベースにiの値が通知されないことです。代わりに、Javaに値を文字列に入れてから、データベースに送信させます。

string sql = "select * from foo where bar =" + i;

データベースは、明示的に指示した内容のみを認識していること、および基本的に実行時に別のホストで実行されるコードを記述していることを常に覚えておく必要があります。

于 2012-12-28T00:33:39.937 に答える
0

SQL文字列を生成し、jdbcを介して呼び出すことができます。バインド変数を使用すると、パフォーマンス、セキュリティの点でより正確になります。また、特殊文字をエスケープする必要もありません。

jdbcでのSQLの使用について学習しているので、バインド変数について読んでください。例はここにあります

于 2012-12-28T00:41:39.193 に答える