私のJAVAクエリステートメントの修正に関する助言が必要ですか?

私のJAVAスクリプトは2つのJAVAクラスで構成されています: RMS queryRMS RMS クラスでは、 queryRMS クラスのメソッドを呼び出します

RMSのJavaクラス(私は実行の開始部分を省略した、以下のメソッドです)

    for (int i = 1; i <= itemCount; i++) {
        GlobalVariables.numberRow = i;
        JavaDatapool.settings();

        String item = queryRPM.connectDB_Multi(configFile,"SELECT ITEM FROM ORDSKU WHERE ORDER_NO  = '" + orderNo + "' ORDER BY ITEM ASC",i);
        JavaDatapool.writeXLS("item",item,GlobalVariables.sheetXLS);
        sleep(1);

    }

queryRMS JAVAクラス

public static String connectDB_Multi(String configFile, String query, int i) throws FileNotFoundException, IOException, SQLException, ClassNotFoundException{
    Properties p = new Properties();
    p.load(new FileInputStream(configFile));

    String serverName = (p.getProperty("RMS_DBServerName"));
    String portNumber = (p.getProperty("RMS_PortNumber"));
    String sid = (p.getProperty("RMS_SID"));
    String url = "jdbc:oracle:thin:@//" + serverName + ":" + portNumber + "/" + sid;
    String username = (p.getProperty("RMS_Username"));
    String password = (p.getProperty("RMS_Password"));
   // jdbc:oracle:thin:@//localhost:1521/orcl

    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection connection = DriverManager.getConnection(url,username,password);     
    String setr = null;
    try {      
        Statement stmt = connection.createStatement();

        try {ResultSet rset = stmt.executeQuery(query);
            try {
                while(rset.absolute(i))   
                    setr = rset.getString(1);
                    return setr;  
            }        
            finally {
                try { rset.close(); 
                } 
                catch (Exception ignore) {}

            }
        } 
        finally {
            try { stmt.close(); 
            } 
            catch (Exception ignore) {}
        }
    } 
    finally {
        try { connection.close(); 
        } 
        catch (Exception ignore) {}

    }
}

それでは、 connectDB_multi クラスを呼び出して、次の部分がExcelワークシート内に保存する文字列を返します。

ループは一度に1行ずつすべての行を返し、Excelワークシート内に保存します。

2回目のループでは、問合せは2行からなる1列を戻しますが、問合せは失敗します。

(rset.absolute(i))の代わりに while(rset.next()) 次に、毎回最初の行のみを返します。データベースから1つの列と行だけが取得されたときにスクリプトが機能します。

3
「クエリがフォールトされています」とはどういう意味ですか?
追加された 著者 Roger Lindsjö,
GlobalVariables.numberRow JavaDatapool.settings()?それはどんなライブラリですか?
追加された 著者 cherouvim,
それらは、とのExcelのシート名のrownumberをリセットするためのものです
追加された 著者 Eve,
このコードは、Javaの経験のない他のユーザーがコードを使用できるように構築されています。彼らが必要とするのは、さまざまな方法を呼び出すことだけです。だからこそコードを私のやり方で作るほうがはるかに簡単なので、非常に非効率的です。
追加された 著者 Eve,

3 答え

あなたのロジックは少し台無しに見えます。

投稿した最初のループを見てください。あなたは効果的に実行しています:

ORDSKU ORDER_NO = '"+ orderNo +"' ORDER BY ITEM ASC の項目を選択してください。

itemCount number of times. Each time you execute it, you are attempting to access the n:th row, n being loop counter. Do you see a problem there? How do you know that the query will return itemCount number of rows? Because if it doesn't, it will fail since you are attempting to access a row that doesn't exist.

私があなたがしたいと思うものは、このようなものです

Statement stmt = connection.createStatement();
ResultSet rset = stmt.executeQuery(query);
while(rset.next()) {
    JavaDatapool.writeXLS("item",rset.getString(1),GlobalVariables.sheetXLS);
}

かなりの時間を要する操作であるため、常に新しい接続を再オープンする必要がないように、接続プーリングの形式を真剣に検討する必要があります。

5
追加された
クエリが実際に複数の行を返すことは確かですか?
追加された 著者 pap,
それからあなたのJavaDatapool.writeXLSメソッドが正しく動作せず、最初の値を2番目の値で上書きします。
追加された 著者 pap,
私はあなたが今書いたことを試してみました。私は最初に2つの代わりに1つのitemnumber(1行)を返します。
追加された 著者 Eve,
はい私は確信しているときに、それは2つのitemnumbersの列を返すクエリを実行する 'アイテム'
追加された 著者 Eve,

このコードは非常に非効率的です。データベースからフェッチしたいプロパティファイルを読み込み、接続を作成し、一致するすべての行を選択し、必要な行にスキップしてその行だけを返します。 (あるいは少なくとも私はそれがあなたがやろうとしていることだと思う)。

あなたのコード

while(rset.absolute(i))   
    setr = rset.getString(1);

その行に行かなくても(同じ行が存在していても)存在していても、行が存在していても(そして永遠に続く間は)、その行に行くのが同じであれば、同じ行に移動し続けるのでおそらく無限ループです)。

おそらく1つの選択だけを行い、必要なすべての行を読み込んでExcelファイルに格納するようにプログラムを再構築する必要があります。これを実行している間に、実際に期待するデータが得られているかどうかをデバッグすることができます。

新しい接続を作成し、各行に対して一度クエリを行うという非効率的なコードとは別に、必要な行の数をどのように知っていますか?

私は最後に、あなたはこのようなものが欲しいと思います

....
while(rset.next()) {
    JavaDatapool.writeXLS("item",item,GlobalVariables.sheetXLS);
}

そして、達成するために睡眠(1)サポートは何ですか?

1
追加された
非効率性に言及するため+1。
追加された 著者 MaDa,

FYI:ロジックまたはpapのソリューションとして文を頻繁に開いて閉じると、「java.sql.SQLException:ORA-01000:最大オープンカーソルが超過しました」というエラーメッセージが表示されることがあります。

私はあなたに「あまり一般化しない」ことをお勧めします。 OOPプログラマーの多くが一般化を過ぎていることが分かりました。それは痛いものです。あなたは目標によって設計しなければなりません。目標は「まさに整列」でも「コードが美しく見える」べきでもなく、設計の目的を持っていなければなりません。

0
追加された