programing

Java에서 여러 SQL 문 실행

padding 2023. 8. 21. 20:56
반응형

Java에서 여러 SQL 문 실행

Java에서 쿼리를 실행하고 싶습니다.

연결을 만듭니다.그런 다음 실행하고 싶습니다.INSERT문, 완료되면 연결이 닫히지만 연결에 의해 삽입 문을 실행하고 루프가 완료되면 연결을 닫습니다.

어떻게 해야 합니까?

내 샘플 코드는 다음과 같습니다.

public NewClass() throws SQLException {
    try {
        Class.forName("oracle.jdbc.driver.OracleDriver");
    } catch (ClassNotFoundException e) {
        System.out.println("Where is your Oracle JDBC Driver?");
        return;
    }
    System.out.println("Oracle JDBC Driver Registered!");

    Connection connection = null;
    try {
        connection = DriverManager.getConnection(
                "jdbc:oracle:thin:@localhost:1521:orcl1", "test",
                "oracle");
    } catch (SQLException e) {
        System.out.println("Connection Failed! Check output console");
        return;
    }

    if (connection != null) {
        Statement stmt = connection.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT * from test.special_columns");
        while (rs.next()) {
            this.ColName = rs.getNString("column_name");
            this.script = "insert into test.alldata (colname) ( select " +  ColName + "   from test.alldata2       ) " ;
            stmt.executeUpdate("" + script);
        }        
    }
    else {
        System.out.println("Failed to make connection!");
    }        
}

select 문("SELECT * from test.special_columns")가 실행되면 루프는 두 번이어야 하지만 (stmt.executeUpdate("" + script))가 실행되고 완료된 다음 연결을 닫고 클래스에서 돌아갑니다.

다음 사용 예addBatch&executeBatch여러 SQL 명령을 동시에 실행하는 명령입니다.

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);
      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());
   }
} 

결과: 위의 코드 샘플은 다음과 같은 결과를 생성합니다.결과는 다를 수 있습니다.

rows before batch execution= 6
Batch executed
rows after batch execution= = 9 

원본: 여러 SQL실행

스키마나 각 테이블에 포함된 데이터가 없는 경우 다음과 같은 가정을 할 것입니다.

테이블special_columns다음과 같이 보일 수 있습니다.

column_name
-----------
column_1
column_2
column_3

테이블alldata2다음과 같이 보일 수 있습니다.

column_1  | column_2  | column_3
---------------------------------
value_1_1 | value_2_1 | value_3_1
value_1_2 | value_2_2 | value_3_2    

테이블alldata삽입 후 다음과 같이 발생해야 합니다.

colname
---------
value_1_1
value_1_2
value_2_1
value_2_2
value_3_1
value_3_2

이러한 가정을 전제로 다음과 같은 데이터를 복사할 수 있습니다.

try (
  Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl1", "test", "oracle")
)
{
  StringBuilder columnNames = new StringBuilder();

  try (
    Statement select = connection.createStatement();
    ResultSet specialColumns = select.executeQuery("SELECT column_name FROM special_columns");
    Statement insert = connection.createStatement()
  )
  {
    while (specialColumns.next())
    {
      int batchSize = 0;             

      insert.addBatch("INSERT INTO alldata(colname) SELECT " + specialColumns.getString(1) + " FROM alldata2"); 

      if (batchSize >= MAX_BATCH_SIZE)
      { 
        insert.executeBatch();
        batchSize = 0;
      }
    }

    insert.executeBatch();
  }

주의해야 할 몇 가지 사항:

  • MAX_BATCH_SIZE데이터베이스 구성 및 삽입할 데이터에 따라 값으로 설정해야 합니다.
  • 이 코드는 Java 7 리소스 사용 시도 기능을 사용하여 데이터베이스 리소스가 완료될 때 릴리스되도록 합니다.
  • 당신은 할 필요가 없었습니다.Class.forName서비스 공급자 메커니즘이 JavaDoc for DriverManager에 자세히 소개되었기 때문입니다.

당신의 코드에는 두 가지 문제가 있습니다.먼저 당신은 같은 것을 사용합니다.Statement목적어(stmt선택 쿼리를 실행하고 삽입합니다.JDBC에서 문을 실행하면 다음이 종료됩니다.ResultSet동일한 개체에 대한 이전 실행의.

코드에서, 당신은 위에 루프합니다.ResultSet각 행에 대해 삽입을 실행합니다.그러나 해당 문을 실행하면 다음이 종료됩니다.ResultSet그리고 따라서 다음 반복 시에 호출합니다.next()을 던질 것입니다SQLException처럼ResultSet마감되었습니다.

해결책은 두 가지를 사용하는 것입니다.Statement객체: 하나는 선택을 위한 것이고 하나는 삽입을 선택을 위한 것입니다.그러나 작업 중에 기본적으로 항상 작동하는 것은 아닙니다.autoCommit(기본값), 그리고 자동 커밋을 사용하면 모든 문의 실행은 이전 트랜잭션을 커밋합니다(일반적으로 이것은 또한 닫힙니다).ResultSet데이터베이스와 JDBC 드라이버에 따라 다를 수 있습니다.자동 커밋을 사용하지 않도록 설정하거나 JDBC 드라이버의 기본값이 아닌 경우 결과 집합을 보류 가능한 오버 커밋으로 만들어야 합니다.

언급URL : https://stackoverflow.com/questions/24157194/execute-multiple-sql-statements-in-java

반응형