Нужен совет по исправлению моего запроса JAVA? - PullRequest
3 голосов
/ 25 ноября 2011

Мой сценарий 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 class

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 и затем возвращает String гдеследующая часть сохраняет его на листе Excel.

Цикл должен возвращать все строки, по одной за раз, а затем сохранять его на листе Excel.

Во второй раз в циклезапрос не выполнен, даже если запрос должен возвращать 1 столбец, состоящий из 2 строк.

оригинал содержал часть while(rset.next()) вместо while(rset.absolute(i)), но следующая возвращала только первую строку каждый раз.поэтому скрипт работает, когда из базы данных извлекается только один столбец и строка.

Ответы [ 3 ]

5 голосов
/ 25 ноября 2011

Ваша логика выглядит немного испорченной.

Посмотрите на первый опубликованный вами цикл.Вы эффективно выполняете:

SELECT ITEM FROM ORDSKU WHERE ORDER_NO = '" + orderNo + "' ORDER BY ITEM ASC

itemCount количество раз.Каждый раз, когда вы выполняете его, вы пытаетесь получить доступ к n : й строке, где n - счетчик цикла.Вы видите проблему там?Откуда вы знаете, что запрос вернет itemCount количество строк?Потому что если этого не произойдет, произойдет сбой, так как вы пытаетесь получить доступ к несуществующей строке.

Я подозреваю, что вы ХОТИТЕ сделать что-то вроде этого

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

Вам также следует серьезно рассмотреть возможность использования какой-либо формы пула соединений, чтобы избежать необходимости постоянно открывать новые соединения, поскольку это довольно трудоемкая операция.

1 голос
/ 25 ноября 2011

Этот код кажется очень неэффективным: для каждой строки, которую вы хотите извлечь из базы данных, вы читаете файл свойств, создаете соединение, выбираете все соответствующие строки, переходите к нужной строке и возвращаете только эту строку.(Или, по крайней мере, я думаю, что это то, что вы пытаетесь сделать).

Ваш код

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

, вероятно, представляет собой бесконечный цикл, поскольку он будет продолжать идти в одну и ту же строку до тех пор, покакак можно перейти к этой строке, так что либо эта строка не существует (а время существует), либо строка существует (и пока продолжается вечно).

Вы, вероятно, должны реструктурировать свою программу так, чтобы выполнять тольковыберите и прочитайте все нужные вам строки и сохраните их в своем файле Excel.При этом вы можете выполнить отладку, чтобы увидеть, действительно ли вы получаете ожидаемые данные.

Помимо неэффективного кода создания новых соединений и запроса по одному разу для каждой строки, как узнать, сколько строк вы хотите получить??

Думаю, в конце концов, вы захотите что-то вроде этого

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

И для чего нужна поддержка sleep (1)?

0 голосов
/ 25 ноября 2011

FYI: если вы открываете и закрываете оператор слишком часто, как решение вашей логики или pap, вы можете получить сообщение об ошибке «java.sql.SQLException: ORA-01000: превышено максимальное количество открытых курсоров».

Iпредлагаю вам не делать «слишком много обобщений».Я видел, что многие программисты ООП перестарались с обобщениями, и это больно.Вы должны проектировать с целью, и цель не должна быть «просто выравнивание» или «код выглядит красиво», это должна быть цель для проектирования.

...