복붙노트

[SQL] 한 성명에서 자바 실행 여러 개의 쿼리

SQL

한 성명에서 자바 실행 여러 개의 쿼리

현재는 MySQL의 쿼리 브라우저에서 가능하다하더라도 예외를 제공하기 때문에이 JDBC를 사용하여 뭔가를 실행할 수있는 경우 안녕하세요 궁금 해서요.

"SELECT FROM * TABLE;INSERT INTO TABLE;"

나는 그것이 SQL 쿼리 문자열 인 분할 두 번 실행 문을 가지고 있지만, 이것에 대한 한 번 방법이 있는지 궁금 해서요 가능합니다 실현을하는 동안.

    String url = "jdbc:mysql://localhost:3306/";
    String dbName = "databaseinjection";
    String driver = "com.mysql.jdbc.Driver";
    String sqlUsername = "root"; 
    String sqlPassword = "abc";

    Class.forName(driver).newInstance();

    connection = DriverManager.getConnection(url+dbName, sqlUsername, sqlPassword);

해결법

  1. ==============================

    1.이 사용하는 JDBC 뭔가를 실행할 수 있는지 궁금했다.

    이 사용하는 JDBC 뭔가를 실행할 수 있는지 궁금했다.

    "SELECT FROM * TABLE;INSERT INTO TABLE;"
    

    네, 가능합니다. 두 가지 방법이 내가 아는 한,이 있습니다. 그들은

    다음의 예는 위의 두 가지 가능성을 보여줍니다.

    예 1 : (여러 쿼리를 허용하려면) :

    연결 요청을 보내는 동안, 당신은 데이터베이스 URL로 연결 속성 allowMultiQueries = TRUE를 추가해야합니다. 이미 네, autoReConnect = 사실, allowMultiQueries 속성 등 사용할 수있는 값이 거짓 사실처럼, 어떤 존재, 어떤 경우에 사람들에게 추가 연결 속성입니다. 다른 값은 SQLException을 가진 런타임에 거부됩니다.

    String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true";  
    

    이러한 명령이 전달되지 않는 한, SQLException가 throw됩니다.

    당신은 쿼리 실행의 결과를 가져 오기 위해 실행 (문자열 SQL) 또는 다른 변종을 사용해야합니다.

    boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );
    

    당신이 다음 단계를 필요로하고 처리 결과를 통해 반복하려면 :

    READING_QUERY_RESULTS: // label  
        while ( hasMoreResultSets || stmt.getUpdateCount() != -1 ) {  
            if ( hasMoreResultSets ) {  
                Resultset rs = stmt.getResultSet();
                // handle your rs here
            } // if has rs
            else { // if ddl/dml/...
                int queryResult = stmt.getUpdateCount();  
                if ( queryResult == -1 ) { // no more queries processed  
                    break READING_QUERY_RESULTS;  
                } // no more queries processed  
                // handle success, failure, generated keys, etc here
            } // if ddl/dml/...
    
            // check to continue in the loop  
            hasMoreResultSets = stmt.getMoreResults();  
        } // while results
    

    예 2 : 단계 따르십시오 :

    샘플 테이블과 절차 :

    mysql> create table tbl_mq( i int not null auto_increment, name varchar(10), primary key (i) );
    Query OK, 0 rows affected (0.16 sec)
    
    mysql> delimiter //
    mysql> create procedure multi_query()
        -> begin
        ->  select count(*) as name_count from tbl_mq;
        ->  insert into tbl_mq( names ) values ( 'ravi' );
        ->  select last_insert_id();
        ->  select * from tbl_mq;
        -> end;
        -> //
    Query OK, 0 rows affected (0.02 sec)
    mysql> delimiter ;
    mysql> call multi_query();
    +------------+
    | name_count |
    +------------+
    |          0 |
    +------------+
    1 row in set (0.00 sec)
    
    +------------------+
    | last_insert_id() |
    +------------------+
    |                3 |
    +------------------+
    1 row in set (0.00 sec)
    
    +---+------+
    | i | name |
    +---+------+
    | 1 | ravi |
    +---+------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    

    자바에서 프로 시저를 호출 :

    CallableStatement cstmt = con.prepareCall( "call multi_query()" );  
    boolean hasMoreResultSets = cstmt.execute();  
    READING_QUERY_RESULTS:  
        while ( hasMoreResultSets ) {  
            Resultset rs = stmt.getResultSet();
            // handle your rs here
        } // while has more rs
    
  2. ==============================

    2.당신은 일괄 업데이트를 사용할 수 있지만 쿼리 (즉. 삽입, 업데이트 및 삭제) 쿼리 작업을해야합니다

    당신은 일괄 업데이트를 사용할 수 있지만 쿼리 (즉. 삽입, 업데이트 및 삭제) 쿼리 작업을해야합니다

    Statement s = c.createStatement();
    String s1 = "update emp set name='abc' where salary=984";
    String s2 = "insert into emp values ('Osama',1420)";  
    s.addBatch(s1);
    s.addBatch(s2);     
    s.executeBatch();
    
  3. ==============================

    3.힌트 : 둘 이상의 연결 속성이 경우로 구분합니다 :

    힌트 : 둘 이상의 연결 속성이 경우로 구분합니다 :

    &
    

    당신에게 뭔가를 제공합니다 :

    url="jdbc:mysql://localhost/glyndwr?autoReconnect=true&allowMultiQueries=true"
    

    나는이 어떤 사람 도움이되기를 바랍니다.

    문안 인사,

    글린

  4. ==============================

    4.내 테스트를 기반으로 올바른 플래그는 "allowMultiQueries = 참"

    내 테스트를 기반으로 올바른 플래그는 "allowMultiQueries = 참"

  5. ==============================

    5.왜 시도하고 이것에 대한 저장 프로 시저를 작성 해달라고?

    왜 시도하고 이것에 대한 저장 프로 시저를 작성 해달라고?

    당신은 밖으로 설정 결과를 얻을 수와 같은 저장 프로 시저에 당신은 당신이 원하는 것을 삽입 할 수 있습니다.

    유일한 것은 당신이 선택 후 삽입 경우 결과 집합에 새로 삽입 된 행을 얻지 못할 수도있다.

  6. ==============================

    6.나는이 삭제 엑셀 선택 / 갱신 / 삽입 / 가장 쉬운 방법이라고 생각합니다. 당신은 많은으로 실행할 수 있습니다 갱신 / 삽입 / 유 executeUpdate의 (STR)와 (당신은이 (더미가 필요한 경우) 먼저 선택해야 할) 선택 후 원하는 삭제 (단지 새로운 지능 (사용 COUNT1, COUNT2, ...)) u는 새로운 선택 가까운 '문'과 '연결'을 필요로하고 새로운 만들 경우 다음을 선택합니다. 예처럼 :

    나는이 삭제 엑셀 선택 / 갱신 / 삽입 / 가장 쉬운 방법이라고 생각합니다. 당신은 많은으로 실행할 수 있습니다 갱신 / 삽입 / 유 executeUpdate의 (STR)와 (당신은이 (더미가 필요한 경우) 먼저 선택해야 할) 선택 후 원하는 삭제 (단지 새로운 지능 (사용 COUNT1, COUNT2, ...)) u는 새로운 선택 가까운 '문'과 '연결'을 필요로하고 새로운 만들 경우 다음을 선택합니다. 예처럼 :

    String str1 = "select * from users";
    String str9 = "INSERT INTO `port`(device_id, potition, port_type, di_p_pt) VALUE ('"+value1+"', '"+value2+"', '"+value3+"', '"+value4+"')";
    String str2 = "Select port_id from port where device_id = '"+value1+"' and potition = '"+value2+"' and port_type = '"+value3+"' ";
    try{  
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        theConnection=(Connection) DriverManager.getConnection(dbURL,dbuser,dbpassword);  
        theStatement = theConnection.prepareStatement(str1);
        ResultSet theResult = theStatement.executeQuery();
        int count8 = theStatement.executeUpdate(str9);
        theStatement.close();
        theConnection.close();
        theConnection=DriverManager.getConnection(dbURL,dbuser,dbpassword);
        theStatement = theConnection.prepareStatement(str2);
        theResult = theStatement.executeQuery();
    
        ArrayList<Port> portList = new ArrayList<Port>();
        while (theResult.next()) {
            Port port = new Port();
            port.setPort_id(theResult.getInt("port_id"));
    
            portList.add(port);
        }
    

    나는 그것이 도움이되기를 바랍니다

  7. from https://stackoverflow.com/questions/10797794/multiple-queries-executed-in-java-in-single-statement by cc-by-sa and MIT license