Подтвердить что ты не робот

Как выполнить несколько операторов SQL из java

Я хочу выполнить несколько запросов или задание за один проход. Что-то вроде этого например:

String query="select * from tab1;insert into tab1 values(...);update tab1..;delete from tab1...;"
Statement st = con1.createStatement();
ResultSet rs = st.executeQuery(query); 

Или несколько запросов select.Queries будут динамическими.

Но я не могу этого сделать. Каким образом можно запускать несколько запросов, разделенных точкой с запятой.

4b9b3361

Ответ 1

вы можете добиться этого. В следующем примере используются команды addBatch и executeBatch для выполнения нескольких команд SQL.

Пакетная обработка позволяет группировать связанные операторы SQL в пакет и отправлять их с одним вызовом в базу данных. ссылка

Когда вы отправляете сразу несколько операторов SQL в базу данных, вы уменьшаете объем служебных данных связи, тем самым повышая производительность.

  • Драйверы JDBC не обязаны поддерживать эту функцию. Вы должны использовать метод DatabaseMetaData.supportsBatchUpdates(), чтобы определить, поддерживает ли целевая база данных обработку пакетного обновления. Метод возвращает true, если ваш драйвер JDBC поддерживает эту функцию.
  • addBatch() метод Statement, PreparedStatement и CallableStatement используется для добавления отдельных операторов к партии. executeBatch() используется для запуска всех операторов, сгруппированных вместе.
  • executeBatch() возвращает массив целых чисел, и каждый элемент массива представляет количество обновлений для соответствующего оператора обновления.
  • Так же, как вы можете добавлять инструкции в пакет для обработки, вы можете удалить их с помощью clearBatch(). Этот метод удаляет все заявления, добавленные с помощью метода addBatch(). Однако вы не можете выборочно выбирать, какой оператор удалить.

Пример:

import java.sql.*;

public class jdbcConn {
   public static void main(String[] args) throws Exception{
      Class.forName("org.apache.derby.jdbc.ClientDriver");
      Connection con = DriverManager.getConnection
      ("jdbc:derby://localhost:1527/testDb","name","pass");

      Statement stmt = con.createStatement
      (ResultSet.TYPE_SCROLL_SENSITIVE,
      ResultSet.CONCUR_UPDATABLE);
      String insertEmp1 = "insert into emp values
      (10,'jay','trainee')";
      String insertEmp2 = "insert into emp values
      (11,'jayes','trainee')";
      String insertEmp3 = "insert into emp values
      (12,'shail','trainee')";
      con.setAutoCommit(false);
      stmt.addBatch(insertEmp1);//inserting Query in stmt
      stmt.addBatch(insertEmp2);
      stmt.addBatch(insertEmp3);
      ResultSet rs = stmt.executeQuery("select * from emp");
      rs.last();
      System.out.println("rows before batch execution= "
      + rs.getRow());
      stmt.executeBatch();
      con.commit();
      System.out.println("Batch executed");
      rs = stmt.executeQuery("select * from emp");
      rs.last();
      System.out.println("rows after batch execution= "
      + rs.getRow());
   }
} 

обратитесь http://www.tutorialspoint.com/javaexamples/jdbc_executebatch.htm

Ответ 2

Я не уверен, что вы хотите отправить два оператора SELECT в один запрос, потому что вы не сможете получить доступ к ResultSet s. База данных может возвращать только последний набор результатов.

Множественные ResultSets

Однако, если вы вызываете хранимую процедуру, которая, как вы знаете, может возвращать несколько наборов результатов, что-то вроде этого будет работать

CallableStatement stmt = con.prepareCall(...);
try {
...

boolean results = stmt.execute();

while (results) {
    ResultSet rs = stmt.getResultSet();
    try {
    while (rs.next()) {
        // read the data
    }
    } finally {
        try { rs.close(); } catch (Throwable ignore) {}
    }

    // are there anymore result sets?
    results = stmt.getMoreResults();
}
} finally {
    try { stmt.close(); } catch (Throwable ignore) {}
}

Несколько операторов SQL

Если вы говорите о нескольких операторах SQL и только одном SELECT, ваша база данных должна поддерживать один String SQL. Например, я использовал что-то вроде этого в Sybase

StringBuffer sql = new StringBuffer( "SET rowcount 100" );
sql.append( " SELECT * FROM tbl_books ..." );
sql.append( " SET rowcount 0" );

stmt = conn.prepareStatement( sql.toString() );

Это будет зависеть от синтаксиса, поддерживаемого вашей базой данных. В этом примере обратите внимание на добавление spaces, дополняющее выражения так, чтобы между строками было пустое пространство.